Я бы переписал ваши модели следующим образом:
class Person
has_many :owned_groups, :class_name => "Group", :foreign_key => :owner_id
has_many :owned_group_memberships, :through => :owned_groups,
:source => :group_memberships
has_many :group_memberships, :foreign_key => "member_id"
has_many :groups, :through => :group_memberships
has_many :approved_groups, :through => :group_memberships, :source => :group,
:conditions => [ "group_memberships.status = ? ", true]
has_many :applied_groups, :through => :group_memberships,, :source => :group,
:conditions => [ "group_memberships.status = ? ", false]
end
class GroupMembership
belongs_to :member, :class_name => 'Person'
belongs_to :group
end
class Group
belongs_to :owner, :class_name => "Person"
has_many :group_memberships
has_many :members, :through => :group_memberships
has_many :approved_members,:through => :group_memberships, :source => :member,
:conditions => [ "group_memberships.status = ? ", true]
has_many :applied_members,:through => :group_memberships, :source => :member,
:conditions => [ "group_memberships.status = ? ", false]
end
Теперь дано person
:
# returns all the groups is user is member of
person.groups
# returns all the groups owned by the user
person.owned_groups
# returns the memberships of all the groups owned by the user
person.owned_group_memberships
# returns the memberships requests for all the groups owned by the user
person.owned_group_memberships.find_all_by_status(false)
Вы можете оптимизировать результаты, загрузив группу и участника:
@asked_group_memberships=person.owned_group_memberships.find_all_by_status(false,
:include => [:group, :member])
На ваш взгляд:
<% @asked_group_memberships.each do | agm| %>
<p>
Requester: <%= agm.member.name %>,
Group: <%=agm.group.name%>
</p>
<%end %>
Чтобы проверить, является ли человек членом группы:
person.groups.exists?(group)
Чтобы проверить, является ли человек членом утвержденной группы:
person.approved_groups.exists?(group)