Ruby on rails 轨道避免N+;1查询

Ruby on rails 轨道避免N+;1查询,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,给定以下模型关系 group has_many :members member has_many :missions mission has_one :game_set_mission mission has_one :game_set, :through => :game_set_mission 我就是这么做的 给定的组是一个组对象 # Add a new relationship in member.rb has_many :game_sets, :through => :mi

给定以下模型关系

group has_many :members
member has_many :missions
mission has_one :game_set_mission
mission has_one :game_set, :through => :game_set_mission
我就是这么做的

给定的组是一个组对象

# Add a new relationship in member.rb
has_many :game_sets, :through => :missions

# Get all game_set id
group.members.map{ |gc| gc.game_sets.pluck(:id) }
但它似乎发生了
N+1查询


如何改进我的代码?

希望下面的一个对您有所帮助

GameSet.includes(member: :group)
       .where('groups.id = ?', group.id)
       .pluck('game_sets.id')

当您查询组时,您可以急切地带来间接关联:
group.find_by_id(id,:include=>[{:member=>:mission}])
它抛出了错误:
ArgumentError:arguments数量错误(给定2个,预期1个)
group.includes(member=>:mission)…其中(:id=>id)我认为实例变量不能使用
includes
@CodaChang是的,你是对的,我假设
group
activerelational
objectHashrockets,如果不推荐,请使用
member::group
。实例变量可以包含任何值-类、AR关系等。你不能做的是调用范围方法(包括,其中…)如果您已经从DB加载了关系-例如,调用
.map
.pulk
时会发生这种情况。您也可以将其编写为
。其中(group:group)
更好,因为如果尚未加载组,它将使用组作为子选择,而不是强制提前加载。