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
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...