我有一张餐厅的桌子,有很多保留。现在我想查询所有餐馆,如果他们有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/12270和JOIN ON ... AND conditions when eager loading association in ActiveRecord,但没有提供解决方案。
答案 0 :(得分:1)
我认为迪帕克是对的。 试试这个:
#retaurant.rb
has_many :reservations_for_two, ->{number_of_people: 2}, class_name: 'Reservation'
然后:
Restaurant.preload(:reservations_for_two) #(for two separate queries)
OR
Restaurant.eager_load(:reservations_for_two) #(one join query)
答案 1 :(得分:1)
尝试Restaurant.joins(:reservations).includes(:reservations).where("reservations.number_of_people = ?", 2)