Forum: Ruby on Rails activerecord :include

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.
16a1ea9251add420b5dd7db1d818433f?d=identicon&s=25 hiddenhippo (Guest)
on 2008-10-17 12:27
(Received via mailing list)
basically I've got a design which has a model describing, say a
folder, and within each folder I associate some notes.  I've built my
models so that a folder can have many notes, and that a note belongs
to a folder.  Now, a folder can belongs to a person, and a person
therefore has many folders.  what I'm attempting to do is display all
the folders for a given user, which is pretty simple as I can simply
so

folders = Person.find(1,:include=>[:folders])

however, what I also want to do is display the most recent note
against each folder.  Although I can do this by simply adding the
notes into my include,

folders = Person.find(1,:include=>[:folders=>:notes])

 I'd really perfer not to load each and every note assigned to each
and every folder.  I've been playing about for a while now trying to
get active record to load my assoicates but only include the first
note for each folder.  can anybody help?  maybe it's not even
possible?  Perhaps I need to change my approach?  Any help/advice
would be greatly appreciated/welcome.

thanks
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2008-10-17 12:42
(Received via mailing list)
On 17 Oct 2008, at 11:27, hiddenhippo wrote:
> get active record to load my assoicates but only include the first
> note for each folder.  can anybody help?  maybe it's not even
> possible?  Perhaps I need to change my approach?  Any help/advice
> would be greatly appreciated/welcome.
>
:include can't do that - it's fundamentally hard from it's point of
view to only fetch the first record of some collection

Fred
C64e63b70be7dfed8b0742540b8b27e5?d=identicon&s=25 Mark James (Guest)
on 2008-10-18 01:33
(Received via mailing list)
hiddenhippo wrote:
> however, what I also want to do is display the most recent note
> would be greatly appreciated/welcome.
This may work:

class Folder < ActiveRecord::Base
   has_one :most_recent_note, :class_name => 'Note',
           :foreign_key => :note_id, :conditions =>
           'notes.created_at = (select max(created_at) from notes)'
end

folders = Person.find(1, :include => {:folders => :most_recent_note})

--
Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com
C64e63b70be7dfed8b0742540b8b27e5?d=identicon&s=25 Mark James (Guest)
on 2008-10-18 01:57
(Received via mailing list)
Mark James wrote:
> This may work:
>
> class Folder < ActiveRecord::Base
>    has_one :most_recent_note, :class_name => 'Note',
>            :foreign_key => :note_id, :conditions =>
>            'notes.created_at = (select max(created_at) from notes)'
> end
>
> folders = Person.find(1, :include => {:folders => :most_recent_note})

Sorry, didn't think that one through properly. How about:

has_one :most_recent_note, :class_name => 'Note', :conditions => <<END
notes.id = (select max(id) from notes where notes.folder_id =
folders.id)
END

--
Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com
This topic is locked and can not be replied to.