我试图更新使用从其他模型中的价值的一个模型的属性问题,但在这两种模式是不相关的。
我的型号有:
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查询)
您有什么推荐的吗? 谢谢
如果我理解你的问题,你想找到一个给定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