Rails:在已经左手连接的桌子上急切加载?

swa*_*jak 8 activerecord ruby-on-rails ruby-on-rails-4 rails-activerecord

我们已经离开了一个表,以便我们可以按列排序,如果存在关系:

people = Person
  .joins("LEFT JOIN addresses ON addresses.id = people.address_id")
  .order("addresses.country")
  .all
Run Code Online (Sandbox Code Playgroud)

这导致单个SQL查询,但我不想people.first.address触发SQL来加载地址.我是离开加入的,因为有些人没有地址.

.includes(:address) 触发单独的查询.

您可以使用内部联接来执行我所建议的操作includes,但是会触发2个SQL查询:

Person.includes(:address).all
Run Code Online (Sandbox Code Playgroud)

虽然joins+ includes只触发一个(但INNER联接):

Person.joins(:address).includes(:address).all
Run Code Online (Sandbox Code Playgroud)

如果在急切加载时强制加入,则活动记录也会使用左联接 .eager_load(:addresses).

您是否可以采用现有的左连接并使用这些结果加载轨道?到目前为止我找不到这个.

Erv*_*ouS 2

好吧,在您的情况下,您可以选择查询,为您要使用的字段创建别名,地址如下:

people = Person
         .joins("LEFT JOIN addresses ON addresses.id = people.address_id")
         .select("people.*, addresses.country as address_country")
         .order("address_country")
         .all
Run Code Online (Sandbox Code Playgroud)

这不会改变您想要的查询,也不会导致额外的查询,至少对于国家/地区而言不会。