activerecord :include

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

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.

: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

hiddenhippo wrote:

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.

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})

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