Dynamically add includes to an association?

I have an association user.lessons. Sometimes i just want the lessons, other times i want the lessons to eager-load one of their own associations, 'assets'. Theres a couple of ways i can see to deal with this and i'm not super happy with any of them.

approach 1) Make two associations: has_many :lessons has_many :lessons_with_assets, :class_name => "Lesson", :include => [:assets]

#then, if i want the assets, call @user.lessons_with_assets

This is actually my favorite but it still feels a bit clumsy

approach 2) Don't use the association if i want to eager load #just do a regular find Lesson.find_all_by_user_id(@user.id, :include => [:assets])

Is there another way? This example is simple but i have other associations that go through join tables and are polymorphic (eg using the has_favorite plugin) that are a bit more arsey to use.

thanks max

Max

There’s another way, named_scopes.

in the Lesson model, add named_scope :with_assets, :include => :assets

then you can call lessons or lessons.with_assets

aha...so, if i have lots of different associations (in user and other classes) that return a collection of lessons i can just add ".with_assets" to the end? eg

user.usb_lessons.with_assets

user.lessons.with_assets

resource.recent_lessons.with_assets

etc ?

Max

There's another way, named_scopes.

in the Lesson model, add named_scope :with_assets, :include => :assets

then you can call lessons or lessons.with_assets

See also http://ryandaigle.com/articles/2008/8/20/named-scope-it-s-not-just-for-conditions-ya-know

Fred

Yes, on more complicated joins, where Rails thinks it will be better, it does split the query into multiple queries.