How do you eager load associations?

51 views
Skip to first unread message

George

unread,
Dec 29, 2009, 7:52:18 AM12/29/09
to DataMapper
Hi there,

I notice from my dm log that when I populate a picklist from a model
it is fetching an associated field by running a query for EVERY item
in the list. I know this is because I am also displaying the
associated field value in the list but how can I encourage dm to eager
load the associated fields in the initial query?

Here's the model and the association:

class Supplier
property :id, Serial
property :name, String, :default => 'New supplier'
belongs_to :currency, :model => "ExchangeRate", :child_key =>
[:currency_id]

# Supplier name and currency string: (Eg: "British Airways [GBP]")
def name_and_currency
name = self.name.empty? ? '(blank supplier name)' : self.name
currency = self.currency && self.currency.name || '(no currency)'
return name + " [" + currency + "]"
end
end

Here's the attempt to populate the list in merb view: (Note use of
custom name_and_currency method)
<%= select :supplier_id, :label => 'Supplier', :collection =>
Supplier.all(:order => [:name]), :value_method => :id, :text_method
=> :name_and_currency %>

Many thanks,
George

PS: I think this old post was trying to achieve the same thing but
perhaps the syntax has changed since then:
http://groups.google.com/group/datamapper/browse_thread/thread/676d4353a796f68a/e819d6ba2aa80128?lnk=gst&q=eager+load#e819d6ba2aa80128

George

unread,
Dec 29, 2009, 11:29:26 AM12/29/09
to DataMapper
FWIW I've found a workaround for this:

Instead of binding the :collection attribute of the select element to
a DM collection, I populate an array first, then bind to the array.

So instead of this:


<%= select :supplier_id, :label => 'Supplier',
:collection => Supplier.all(:order => [:name]),
:value_method => :id,
:text_method => :name_and_currency %>

I'm using this:
<%
@suppliers.each do |supplier|
supplier_list << [ supplier.id, supplier.display_name ]
end
%>


<%= select :supplier_id, :label => 'Supplier',

:collection => supplier_list %>

Using my own 'each' loop successfully encourages DM to do it's
Stategic Eager Loading magic.
I can see why this is the case, though it raises the question of
whether the Merb/Rails3 select list could be refactored to encourage
SEL?!

Hope this helps someone.
George

> perhaps the syntax has changed since then:http://groups.google.com/group/datamapper/browse_thread/thread/676d43...

Reply all
Reply to author
Forward
0 new messages