Best way to collect child rows

I'm trying to find the best way to handle this task, and I'm not having much luck. I think I lack knowledge of the terminology to research this. I have these models:

Account, which has many Pages Page, has many Items Item, has many Tags (through a join model: ItemTag) Tag, has many Items (through same join model)

What's the simplest way to retrieve all Tags associated with an Account? Right now, the best I can do is iterate through each Item and add the associated tags to an array. This seems overly cumbersome, and I'm hoping there's a better way. Any advice?

Jeff wrote:

I'm trying to find the best way to handle this task, and I'm not having much luck. I think I lack knowledge of the terminology to research this. I have these models:

Account, which has many Pages Page, has many Items Item, has many Tags (through a join model: ItemTag) Tag, has many Items (through same join model)

What's the simplest way to retrieve all Tags associated with an Account? Right now, the best I can do is iterate through each Item and add the associated tags to an array. This seems overly cumbersome, and I'm hoping there's a better way. Any advice?

I think you're looking for has_and_belongs_to_many association. Try something like:

#app/models/item.rb has_and_belongs_to_many :tags

#app/models/tag.rb has_and_belongs_to_many :items

#app/models/item_tag.rb has_many :tags has_many :items

I haven't tested that but it should do what you want.

HTH

Matt

What I have now is similar, but using has_many :through instead of habtm. What I'm looking for is something functionally equivalent to:

account = Account.find(:first) account.tags # returns all tags across all items, on all pages

Note that the tags are actually associated with items, which are associated with pages, which are associated with accounts. A few degrees of separation there. Will switching to habtm allow this?

Thanks, Jeffr

Jeff wrote:

What I have now is similar, but using has_many :through instead of habtm. What I'm looking for is something functionally equivalent to:

account = Account.find(:first) account.tags # returns all tags across all items, on all pages

Note that the tags are actually associated with items, which are associated with pages, which are associated with accounts. A few degrees of separation there. Will switching to habtm allow this?

Not that I'm aware of. Sorry but I think I misread the critial part of your post. As far as I know (and some ruby genius will come up with a far better idea) the only way to do what you want is to iterate through the pages and the items and then collect tags.

It might be possible to do it with an association but I don't know how, although I would be interested to know if it is possible.

Thanks, Jeffr

Matt

def tags    pages.map(&:items).map(&:tags) end

If you must.