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).
您是否可以采用现有的左连接并使用这些结果加载轨道?到目前为止我找不到这个.
好吧,在您的情况下,您可以选择查询,为您要使用的字段创建别名,地址如下:
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)
这不会改变您想要的查询,也不会导致额外的查询,至少对于国家/地区而言不会。
| 归档时间: |
|
| 查看次数: |
543 次 |
| 最近记录: |