ruby-on-rails – Rails:在已经左手连接的桌子上急切加载?

我们已经离开了一个表,以便我们可以按列排序,如果存在关系:
people = Person
  .joins("LEFT JOIN addresses ON addresses.id = people.address_id")
  .order("addresses.country")
  .all

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

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

您可以使用包含内部联接的建议,但这会触发2个SQL查询

Person.includes(:address).all

虽然联接包含触发器只有一个(但INNER联接):

Person.joins(:address).includes(:address).all

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

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

解决方法

试试这个:
people = Person.
  eager_load(:address).
  merge(Address.order("coalesce(country,'')")).
  all

people.first.address

eager_load通过执行LEFT OUTER JOIN强制执行加载.

我在国家/地区添加一个合并,以便您可以更好地控制没有地址的人在结果中出现的位置.

这是我的样子:

people = Person.
  eager_load(:address).
  merge(Address.order("coalesce(country,'')")).
  all

(0.5ms)  SELECT disTINCT COUNT(disTINCT "people"."id") FROM "people" LEFT OUTER JOIN "addresses" ON "addresses"."person_id" = "people"."id"
sql (2.1ms)  SELECT "people"."id" AS t0_r0,"people"."name" AS t0_r1,"people"."created_at" AS t0_r2,"people"."updated_at" AS t0_r3,"addresses"."id" AS t1_r0,"addresses"."person_id" AS t1_r1,"addresses"."address" AS t1_r2,"addresses"."country" AS t1_r3,"addresses"."created_at" AS t1_r4,"addresses"."updated_at" AS t1_r5 FROM "people" LEFT OUTER JOIN "addresses" ON "addresses"."person_id" = "people"."id" ORDER BY coalesce(addresses.country,'')


people.first.address
nil

people.last.address
#<Address:0x007febabb508a8> {
            :id => 1,:person_id => 4,:address => "24175 Gerhold Prairie",:country => "O",:created_at => Thu,01 Feb 2018 18:47:45 UTC +00:00,:updated_at => Thu,01 Feb 2018 18:47:45 UTC +00:00
}

请注意,访问地址时不会运行任何查询

我会指出你已经通过一个离开外部连接的表来排序,所以你需要决定如何处理空值.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...