jduff
(John Duff)
1
is there a way to always eagerly load an associated object so that you
don't have to put :include into every finder?
class Product <ActiveRecord::Base
belongs_to :user #always load user when product is loaded
end
Product.find(1).user.login
#1 query since user was loaded with the product, same as if i
used :include but I don't want to have to specify it everywhere.
i'm not aware of any config to do this automatically... perhaps
someone more experienced knows a way.
another way is to make a method in your model:
class Product <ActiveRecord::Base
belongs_to :user
def self.find_eager(id)
self.find(id, :include => :user)
end
end
note you'd have to do a little more work to get it to work with all
options to find(), like :all, :conditions, :order etc...
Daniel_N
(Daniel N)
3
I would do it similarly.
I believe this would be a good fit for with_scope
http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M001024
class Product <ActiveRecord::Base
belongs_to :user
def self.find_eager(*args)
with_scope( :find => { :include => [:user] } ) do
find(*args)
end
end
end
You could also alias_method_chain find on the Product class and wrap
find in a with_scope there instead. That way could be neater.
Cheers
Daniel
Daniel_N
(Daniel N)
4
I thought I’d check out how to alias_method_chain for the Product Class to wrap the find method. This is untested mostly. YMMV
class Product <ActiveRecord::Base
belongs_to :user
class << self
def find_with_user_scope( *args )
with_scope( :find => { :include => :user } ) do
find( *args )
end
end
alias_method_chain :find, :user_scope
end
end
This way whenever you call Product.find it will be scoped to include the user. If you don’t want to include the user then you can use
Product.find_without_user_scope( *args )
HTH
Daniel