Rails 4: изменение запроса на загрузку при использовании.includes(: association)

У меня две модели:

class User < ActiveRecord::Base
 has_many :purchases

 # Perform joins and attach some calculations to the User object
 scope :add_stats, -> { group("users.id").joins(:purchases).select("users.*, SUM(purchases.price) AS total_purchases") }
end

class Purchase < ActiveRecord::Base
 belongs_to :user
end

Область add_stats представляет собой тяжелые вычисления, связанные с объектами User. Поэтому, если я хочу, чтобы все объекты User со статистикой, я просто пишу User.all.add_stats.

Все идет нормально. Теперь я хочу получить некоторые объекты Purchase и загрузить загрузку User с помощью статистики. Я пробовал это:

belongs_to :user, → { add_stats }

Но затем, когда Рельсы нетерпеливые нагрузки пользователей, кажется, удалить .group("user.id").joins(:purchases) И жалуются на purchases.price - "закупка таблица неизвестной". Так что .select() - единственное, что сохранилось из области.

Как применить область (с рабочей .group().joins()) к belongs_to :user запросу загрузки всех включенных belongs_to :user?

1 ответ

Я просто попробовал это в своем приложении rails4, и он работает

class User < ActiveRecord::Base
 scope :add_stats, -> { group("users.id").joins(:events).select("users.*, SUM(events.id) AS total_events") }

class Event
 belongs_to :user, -> { add_stats }

в консоли rails

Event.includes(:users).first.user.total_events
Reloading...
 Event Load (0.1ms) SELECT "events".* FROM "events" WHERE "events"."label" = 'hamburg' ORDER BY "events"."id" ASC LIMIT 1
 Participant Load (0.3ms) SELECT "participants".* FROM "participants" WHERE "participants"."event_id" IN (2)
 User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (1, 2, 3, 4, 8, 10, 11, 12, 14, 16, 17, 18, 19, 20)
 User Load (0.3ms) SELECT users.*, SUM(events.id) AS total_events FROM "users" INNER JOIN "events" ON "events"."user_id" = "users"."id" WHERE "users"."id" = ? GROUP BY users.id ORDER BY "users"."id" ASC LIMIT 1 [["id", 2]]
=> 68

Event.first.user.total_events
Reloading...
 Event Load (0.2ms) SELECT "events".* FROM "events" WHERE "events"."label" = 'hamburg' ORDER BY "events"."id" ASC LIMIT 1
 User Load (0.2ms) SELECT users.*, SUM(events.id) AS total_events FROM "users" INNER JOIN "events" ON "events"."user_id" = "users"."id" WHERE "users"."id" = ? GROUP BY users.id ORDER BY "users"."id" ASC LIMIT 1 [["id", 2]]
=> 68

я думаю, что это не то, что вы хотите, так как это не использует возможности для include.

licensed under cc by-sa 3.0 with attribution.