ruby - Rails 4: Modify eager load query when using .includes(:association) -
i have 2 models:
class user < activerecord::base has_many :purchases # perform joins , attach calculations user object scope :add_stats, -> { group("users.id").joins(:purchases).select("users.*, sum(purchases.price) total_purchases") } end class purchase < activerecord::base belongs_to :user end
the add_stats
scope represents heavy calculations attached user
objects. if want user
objects stats, write user.all.add_stats
.
so far good. want fetch purchase
objects , eager load user
s with stats well. i've tried this:
belongs_to :user, -> { add_stats }
but when rails eager load users, seems remove .group("user.id").joins(:purchases)
, complain on purchases.price
- "purchases table unknown". .select()
thing preserved scope.
how apply scope (with working .group().joins()
) eager load query of included belongs_to :user
objects?
i tried in rails4 app , works
class user < activerecord::base scope :add_stats, -> { group("users.id").joins(:events).select("users.*, sum(events.id) total_events") } class event belongs_to :user, -> { add_stats }
in rails console
event.includes(:users).first.user.total_events reloading... event load (0.1ms) select "events".* "events" "events"."label" = 'hamburg' order "events"."id" asc limit 1 participant load (0.3ms) select "participants".* "participants" "participants"."event_id" in (2) user load (0.3ms) select "users".* "users" "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) total_events "users" inner join "events" on "events"."user_id" = "users"."id" "users"."id" = ? group users.id order "users"."id" asc limit 1 [["id", 2]] => 68 event.first.user.total_events reloading... event load (0.2ms) select "events".* "events" "events"."label" = 'hamburg' order "events"."id" asc limit 1 user load (0.2ms) select users.*, sum(events.id) total_events "users" inner join "events" on "events"."user_id" = "users"."id" "users"."id" = ? group users.id order "users"."id" asc limit 1 [["id", 2]] => 68
i guess not want, not use scope include.
Comments
Post a Comment