【发布时间】:2018-10-11 14:00:50
【问题描述】:
我有如下三个模型:
class Parent < ApplicationRecord
has_many :children
has_many :assets
end
class Child < ApplicationRecord
belongs_to :parent
end
class Asset < ApplicationRecord
belongs_to :parent
end
现在我需要通过父母找出属于孩子的资产。并且“资产”具有资产类型列。所以我需要做这样的事情
Parent.first.children.each do |child|
child.parent.assets.find_by(asset_type: "first").asset_value
end
如何避免 N+1 查询?
导轨:5.1.6
红宝石:2.3.4
【问题讨论】:
-
我认为您在该查询中没有 N+1 问题,除非您想做类似
Child.each do |child| -
是的,你是对的。我需要迭代孩子。对不起,我错过了。编辑了帖子。谢谢
-
也许这只是个例子,但我不明白你为什么说
Parent.first.children,然后是child.parent.assets。既然孩子只有一个父母,那么你应该说Parent.first.assets.find_by(asset_type: 'first').asset_value -
@KPheasey 我猜这是一个玩具示例,这个想法需要应用于
parents 的集合,并且每个子资产需要做的事情比显示的要多这里。很好地避免了 IMO 的噪音。 -
是的,这只是一个例子。真实场景更复杂。孩子患有性病。
标签: ruby-on-rails activerecord ruby-on-rails-5 eager-loading