Rails - не могу делать правильные запросы - PullRequest
0 голосов
/ 22 мая 2011

В моем приложении Person может иметь Group, а группа может принадлежать только одному человеку.Но люди тоже могут быть частью группы, не как владельцы, а как члены.Группа может иметь более одного члена.Чтобы человек стал участником, ему / ей нужно попросить Group_Membership.Таким образом, создается модель group_membership с boolean status с false по умолчанию.Владелец группы, затем впустил участника, изменив значение status на true.Вот модели:

class Person
has_many :groups
has_many :group_memberships, :foreign_key => "member_id"
end

class Group_Membership
belongs_to :member, :class_name => 'Person'
belongs_to :group
scope :asked, where(:status => false)
end

class Group
belongs_to :person
has_many :group_memberships
has_many :members, :class_name => "Person", :through => "group_memberships", :foreign_key => "member_id"

Мне нужно отобразить в person#show группы, в которые входит этот человек, а также запросы, которые он получил в принадлежащих ему группах..

def show
@person = Person.find(params[:id])
@asked_membership = @person.group_memberships.asked.where(:member_id => params[:id]) 
@group = @person.groups.where(:person_id => params[:id])
@asked_group = @person.group_memberships.asked.where(:group_id => params[@group])
end

Благодаря этому я могу видеть группы, в которых находится человек, даже если для проверки status в scope задано значение false (поскольку по умолчанию статус falseпоказать все запросы, сделанные человеком).Это представление:

    <% @asked_membership.each do |group_membership| %>
    <%=h group_membership.member_id %> 

Как можно с помощью этого представления отображать название групп вместо member_id?

И @asked_group - это правильный запрос для меняполучить все запросы от других лиц о присоединении к группе, принадлежащей данному лицу?Если это так, (:group_id => params[@group]) всегда получает нулевое значение, и я не знаю, как его исправить.

Заранее спасибо.

## EDIT ##

Изменив @asked_group на @asked_group = @person.group_memberships.asked.where(:group_id => @group.id) и добавив его к Group Controller, он заработал.Теперь все равно нужно отображать имя группы вместо member_id.

1 Ответ

2 голосов
/ 22 мая 2011

Я бы переписал ваши модели следующим образом:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...