Through and through

I have users, groups, permissions, and volumes, with these
relationships:

  • users HABTM groups

  • groups has_many permissions

  • permissions has_many volumes

  • groups has_many volumes :through => permissions

Is there an easy way to get all the volumes a user has access to? I can
always get a list of groups, loop over it, and get the volumes, but I
was hoping for something elegant like user.groups.volumes.

Possible?

Brian A. wrote:

Is there an easy way to get all the volumes a user has access to? I can
always get a list of groups, loop over it, and get the volumes, but I
was hoping for something elegant like user.groups.volumes.

Possible?

Perhaps something like user.groups[0].volumes would work.

Brian A. wrote:

I have users, groups, permissions, and volumes, with these
relationships:

  • users HABTM groups

  • groups has_many permissions

  • permissions has_many volumes

  • groups has_many volumes :through => permissions

Is there an easy way to get all the volumes a user has access to? I can
always get a list of groups, loop over it, and get the volumes, but I
was hoping for something elegant like user.groups.volumes.

Possible?

@user.groups.map{|g| g.volumes}.flatten

OR, the DRY way:

class Users < ActiveRecord::Base
def volumes
self.groups.map{|g| g.volumes}.flatten
end

Then you can call @user.volumes.

Brian A. wrote:

Is there an easy way to get all the volumes a user has access to? I can
always get a list of groups, loop over it, and get the volumes, but I
was hoping for something elegant like user.groups.volumes.

Possible?

Maybe something like this:

@volumes = []
user.groups.each { |g| @volumes += g.volumes }

You can try to make it more efficient by first querying @groups =
user.groups.find(:all, :include => :volumes)

Although I’m not sure what the status is of eager loading of :through
relationships.

I assume you are doing something with permissions that would limit what
you could do with a volume, so you could conceivable end up with
multiple instances of a volume, each with different permissions. How
would you resolve that?

-matthew

I assume you are doing something with permissions that would limit what
you could do with a volume, so you could conceivable end up with
multiple instances of a volume, each with different permissions. How
would you resolve that?

-matthew

Fill an array with all volumes, then call uniq! to remove dupes.

Thanks for all the responses.