【问题标题】:Rails 4: after_find and includes conflictRails 4:after_find 和包含冲突
【发布时间】: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


【解决方案1】:

这应该可行:

order.suborders.uniq.inspect

Here's a post about it 这可能会给你一些其他的想法。

【讨论】:

  • 谢谢。这确实有效。但是,这并不能解决执行的查询数量问题。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多