ruby-on-rails – 在ActiveRecord中自定义连接的Eager-load

我有一张餐厅的桌子,有很多保留.现在我想查询所有餐馆,如果他们有2人预订,它应该预先加载这些协会.如果没有2的预订,它仍然应该返回餐馆,但有一个空的关联.

为此,我尝试了以下查询:

Restaurant.eager_load(:reservations).where("number_of_people = ?", 2)

但是,这不起作用,因为它丢弃了所有有预订的餐馆,但没有一个是2人.

所以我想做的是将这个条件转移到连接条件.就像是:

Restaurant.joins('LEFT OUTER JOIN \"reservations\" ON \"reservations\".\"restaurant_id\" = \"restaurants\".\"id\" AND \"reservations\".\"number_of_people\" = ?', 2)

这将得到我需要的结果,但是这不是预加载“预订”关联但引起N 1问题.

看起来eager_load似乎不接受自定义查询.我找到了这些线程:https://github.com/rails/rails/issues/12270JOIN ON … AND conditions when eager loading association in ActiveRecord,但没有提供解决方案.

最佳答案 我认为迪帕克是对的.

试试这个:

 #retaurant.rb
 has_many :reservations_for_two, ->{number_of_people: 2}, class_name: 'Reservation'

然后:

  Restaurant.preload(:reservations_for_two) #(for two separate queries)

要么

   Restaurant.eager_load(:reservations_for_two) #(one join query)
点赞