Rails:预加载三个关联之外的模型

Rails: Eager loading for models three associations away

我想在 table 列中显示所有时间表的 table 以及关联的 类、合作伙伴和位置。

# view
<% @schedules.each do |schedule| %>
  <%= schedule.date.strftime("%d %b %Y") %>
  <%= schedule.klass.name %>
  <%= schedule.partner.company %>
  <%= schedule.partner.city.name %>
  <%= schedule.start_time.strftime("%l:%M%P") %> -
  <%= schedule.end_time.strftime("%l:%M%P") %>
<% end %>

# models
Schedule 
  belongs_to :klass
  belongs_to :partner
Klass
  belongs_to :partner
Partner
  belongs_to :city
  has_many   :klasses
  has_many   :schedules
City
  none

# controller Schedules
@schedules = Schedule.includes(:klass, :partner).order(:date, :start_time, :end_time)

不幸的是,当页面加载时,它会多次运行 city 查询。

SELECT "schedules".* FROM "schedules"  ORDER BY "schedules"."date" ASC, "schedules"."start_time" ASC, "schedules"."end_time" ASC
SELECT "klasses".* FROM "klasses" WHERE "klasses"."id" IN (6, 1, 7, 9, 10, 3)
SELECT "partners".* FROM "partners" WHERE "partners"."id" IN (3, 4, 2)
SELECT "cities".* FROM "cities" WHERE "cities"."id" =  LIMIT 1  [["id", 23]]
SELECT "cities".* FROM "cities" WHERE "cities"."id" =  LIMIT 1  [["id", 24]]

我试过这个:

Schedule.includes(:klass, :partner).includes(:city)

但它给了我这个错误:

Association named 'city' was not found on Schedule; perhaps you misspelled it?

我已经阅读了 Rails Active Record 查询指南,但我不知道如何改进查询。任何帮助表示赞赏。谢谢。

Schedule 
  belongs_to :klass
  belongs_to :partner
Klass
  has_many   :schedules
  has_many :partners, through: :schedules
Partner
  belongs_to :city
  has_many   :schedules
  has_many   :klasses, through: :schedules

City
  has_many :partners

查询应该是

@schedules = Schedule.includes(:partner => :city).order(:date, :start_time, :end_time).select('partners.*, cities.name')

知道了:

@schedules = Schedule.includes(:klass, partner: :city).order(:date, :start_time, :end_time)

结果:

SELECT "schedules".* FROM "schedules"  ORDER BY "schedules"."date" ASC, "schedules"."start_time" ASC, "schedules"."end_time" ASC
SELECT "klasses".* FROM "klasses" WHERE "klasses"."id" IN (6, 1, 7, 9, 10, 3)
SELECT "partners".* FROM "partners" WHERE "partners"."id" IN (3, 4, 2)
SELECT "cities".* FROM "cities" WHERE "cities"."id" IN (23, 24)