Ruby on Rails的3 - 加入许多车型可供直接相关的另一个模型不更新一个模型中使用属性的

2019-10-31 12:08发布

我试图更新使用从其他模型中的价值的一个模型的属性问题,但在这两种模式是不相关的。

我的型号有:

class Order < ActiveRecord::Base
  has_many :order_details
  has_many :waybills
end

class OrderDetail < ActiveRecord::Base
  belongs_to :order, :foreign_key => "order_id"
  belongs_to :product, :foreign_key => "product_id"
end

class Waybill < ActiveRecord::Base
  has_many :purchases
  belongs_to :order, :foreign_key => 'order_id'
end

class Purchase < ActiveRecord::Base
  belongs_to :waybill, :foreign_key => 'waybill_id'
  has_many :detail_purchases
end

class DetailPurchase < ActiveRecord::Base
  belongs_to :purchase, :foreign_key => 'purchase_id'
  belongs_to :product, :foreign_key => 'product_id'
end

所以,你可以看到... ...一个“DetailPurchase”属于一种“订单”,但以间接的方式。 和“的OrderDetail”属于一个直接“订单”。

我需要更新“的OrderDetail”使用“DetailPurchase”的产品属性“量”的产品属性“量”。

我们的想法是“新” OrderDetail.quantity =“老” OrderDeatil.quantity - DetailPurchase.quantity(明明的product_id必须是一样的)

所以,我不知道如何“写”使用查询“轨道路”(可能是“Model.find()”,“Model.where()”,“Model.update_attribute()”),或者只是使用原始的SQL查询(顺便说一下,我不知道怎么写或执行原始的SQL查询)

您有什么推荐的吗? 谢谢

Answer 1:

如果我理解你的问题,你想找到一个给定DetailPurchase(宽松)相关的OrderDetail。 要做到这一点,你可以这样做:

class DetailPurchase < ActiveRecord::Base
  belongs_to :purchase, :foreign_key => 'purchase_id'
  belongs_to :product, :foreign_key => 'product_id'

  # Goes up the associations to find the Order at the top of the belongs_to associations
  def parent_order
    purchase.waybill.order
  end

  # Given the parent_order, find the first order_detail that matches our product_id
  def order_detail
    parent_order.order_details.first.where(["product_id = ?", product_id])
  end
end

话虽这么说,有一个你可能要改变几件事情:

首先,你几乎肯定不应该有一个名为“秩序”模式-订单也是一个ActiveRecord实例方法(如ClassName.all.order("name ASC")那么你打开自己高达一个世界的伤害。

它也似乎有点问题的是具有自己的模型另一个模型更新的总价值时,它的变化之一; 你将有各种棘手的逻辑来处理编辑或删除订单明细时用。 它可能会更有意义用于OrderDetail.quantity聚合函数-换句话说,设置OrderDetail.original_quantity上创建,然后计算OrderDetail.quantity作为OrderDetail.original_quantity minus the sum of the relevant purchase detail quantities 。 如果你想要走这条路,我会忽略上面的代码,并添加purchase_details的范围方法的OrderDetail; 看到了API的细节。



文章来源: Ruby on rails 3 - Join many models to update a field of one model using attributes from another model non related directly