Forum: Ruby on Rails Association to return only the first of an associated list

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Max W. (Guest)
on 2008-12-08 12:59
A little background: in our schema, Resource has_many :assets, through a
join table called items.

Whenever we show a resource, we also show a thumbnail for its first
associated asset.  Currently, this means that we're doing a lot of sql
action in the view: for example, a partial like this might be repeated
100 times:

....
<% asset = resource.assets.first %>
<%= image_tag asset.name, asset.path %>
...

Obviously doing loads of little queries in the view isn't good:  what
i'd like to do is somehow eager-load that first asset with the include
option.  We tried making a method called 'primary_asset' which returns
the first asset for a resource, but that can't be "include"d:  i think
that in order to include it i need to set it up as an association.
Which leads me to my actual question:  how do i set up a has_one
association to return only the first asset from the collection of
associated assets?

has_one doesn't seem to have an 'sql' option, otherwise i'd just do
something like

  has_one :primary_asset, :class_name => "Asset", :sql => "SELECT
assets.* FROM assets INNER JOIN items ON assets.id = items.asset_id
WHERE ((items.resource_id = #{id})) ORDER BY position LIMIT 1"

Can anyone see how i can set this up?  I'm using rails 2.0.2.

thanks, max
JDevine (Guest)
on 2008-12-08 20:20
(Received via mailing list)
Have you tried

has_one :primary_asset, :class_name=>"Asset", :order=>"position"


On Dec 8, 4:59 am, Max W. <removed_email_address@domain.invalid>
This topic is locked and can not be replied to.