4

I am using the ancestry gem in my rails project to create a hierarchy of groups. A group can belong to a parent group and can have many children groups. Each group can have many users who belong to a group. The model looks like this:

class Group < ActiveRecord::Base
  has_ancestry

  has_many :users
end

I would love to be able to get all users for the descendants of a group, something like this:

class Group < ActiveRecord::Base
  has_ancestry

  has_many :users
  has_many :descendants_users, through: :descendants
end

which, of course, doesn't work.

Any suggestions?

Rahul garg
  • 9,202
  • 5
  • 34
  • 67
  • if you want to get the users of the group then just call group.users? as far as i understood your post, there is no need for the descendents_users – BvuRVKyUVlViVIc7 Oct 29 '12 at 13:29

2 Answers2

2

Define a method like this in your Group model.

def descendants_users
    User.joins(:groups).where(:group_id => self.subtree_ids) # Use descendant ids if you dont't want 'self' users
end

This will perform 1 query to fetch subtree_ids and 1 query to fetch users, and the result is already distinct users set.

Rahul garg
  • 9,202
  • 5
  • 34
  • 67
1

May be you just should to define method, that returns all of descendants' users. So your model could look like this:

  class Group < ActiveRecord::Base
    has_ancestry

    has_many :users

    def descendants_users
      self.subtree.map(&:users).flatten.compact.uniq
    end
  end
bazuka
  • 84
  • 5
  • This performs query for each group separately (imagine if there are large no. of groups inside the subtree of self) with iteration(s) later on it to cleanup & remove distinct data. See my answer for optimized way for it.. – Rahul garg Feb 06 '13 at 17:23