【发布时间】:2016-04-19 18:25:27
【问题描述】:
在我的 Order 模型中,我有一个 has_many 关联:
has_many :suborders, dependent: :destroy, inverse_of: :order
但是,在找到记录后,我必须进行一些预处理,所以我还有一个 after_find 回调,例如:
after_find :verify_validity
def verify_validity
order.suborders.each do |suborder|
... doing something here with suborders ...
end
end
但是,当我尝试使用其子订单急切加载一批订单时,我得到了重复:
在控制器中:
@orders = Order.active.order(:updated_at => :desc).includes(:suborders)
在视图中:
Order is <%= order.inspect %>
<br />
Order suborders are <%= order.suborders.inspect %>
我得到了
Order is #<Order id: 1126, ...>
Order suborders are #<ActiveRecord::Associations::CollectionProxy [#<Suborder id: 119, order_id: 1126...>, #<Suborder id: 119, order_id: 1126...>]>
如何避免出现这样的重复?
编辑:我还注意到系统两次执行相同的查询(第一次是在after_find,然后是因为includes)。如何让after_find 使用includes 的结果? after_find 中的那个效率非常低(n+1 个查询)。
【问题讨论】:
-
您为什么要在
order模型中进行验证?为什么不在Suborder模型中添加“......在这里用子订单做某事......”? -
@RichPeck 这不是验证:它是基于其子订单的订单模型的更新。而且每次加载时我都需要这样做。
标签: ruby-on-rails activerecord include