Best way to collect child rows


#1

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?


#2

Jeff wrote:

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


#3

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

On Dec 17, 1:17 pm, Matt H. removed_email_address@domain.invalid


#4

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

If you must.


#5

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