Rails — Ассоциация моделей в представлениях

У меня есть такие модели:

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
end

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

Человек просит membership, создавая его модель с помощью status false. Владелец group на своей странице person#show может видеть, кто запросил membership, а также groups, в котором он участвует. Так как groups и group_memberships belongs_to являются person, но group_membership также belongs_to являются group, как я могу сделать вид в person#show, который позволит person видеть, кто запросил memberships на groups у person, а также то, что groups у person есть membership ?

##EDIT##

status здесь false по умолчанию, потому что person будет просто принято в group, если владелец edit этот статус и установит его как true.

Идея взята из этого вопроса: Вопрос об ассоциации и моделях на Rails


person Zeroz    schedule 19.05.2011    source источник
comment
Я не вижу отношения, чтобы определить, кто запросил членство в группе... просто у кого оно уже есть... это просто отсутствующая модель или отношение. Если бы у меня была эта крупица информации, я мог бы лучше ответить на ваш вопрос.   -  person jaydel    schedule 19.05.2011
comment
Здесь вступает в действие статус: если он ложный, членство еще не принято. Владелец группы примет человека в группу, обновив статус до истинного, или отклонит, удалив модель.   -  person Zeroz    schedule 19.05.2011
comment
ой. чтение мой друг. Извини за это.   -  person jaydel    schedule 19.05.2011


Ответы (2)


Вот некоторый псевдокод, который, я думаю, поможет вам достичь желаемого: https://gist.github.com/981513

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

    scope :owned_groups, where(:is_owner => true).joins(:group_memberships) # gets all groups where this person is owner
end

class Group_Membership
    belongs_to :member, :class_name => 'Person'
    belongs_to :group

    # note that these attributes need to be defined
    # is_owner (boolean)
    # member_approved (boolean)

    scope :requested, :where(:member_approved => false)
end

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

Справедливое предупреждение, я вообще не тестировал его, и я все еще изучаю новые шаблоны AR :)

Я думаю, что ваше отношение group_memberships, вероятно, лучше всего подходит в качестве отношения :through, а затем создает области вокруг различных «состояний», которые могут иметь отношения. Вы также можете проверить машину состояний, чтобы получить помощь по этому вопросу.

person brycemcd    schedule 19.05.2011
comment
Спасибо за Ваш ответ! Ну, я подумал о чем-то действительно простом... нет ли способа достичь моей цели, не внося изменений в код и базу данных? - person Zeroz; 19.05.2011
comment
как ваш текущий код узнает о владельце группы и о том, являются ли другие члены утвержденными отношениями с этой группой? - person brycemcd; 19.05.2011
comment
Владелец группы известен, потому что у группы есть FK с именем person_id. Моя идея об отношениях заключалась в том, чтобы сделать простую вещь с status, меня не волнует, всегда ли отношение создается на модели group_membership, моя идея состояла в том, чтобы попытаться отфильтровать его на представлениях и просто показать те, у которых есть status true или что-то в этом роде. как это. Я взял эту идею из другого вопроса из стека, stackoverflow.com/questions/6038298/ - person Zeroz; 20.05.2011
comment
Я думал, что у группы может быть много владельцев по какой-то причине. Наверное, я плохо читаю. Если у вас уже есть столбец состояния, вы можете просто изменить область в модели group_membership на область действия :requested, :where(:status => 'approved'). - person brycemcd; 20.05.2011

я так думаю

class Person
  has_many :groups
  has_many :group_memberships, :foreign_key => "member_id"
  has_many :own_groups, :class_name => "Group", :through => "group_memberships", :foreign_key => "group_id"

end

class Group_Membership
  belongs_to :member, :class_name => 'Person'
  belongs_to :group
end

class Group
  belongs_to :person
  has_many :group_memberships
  has_many :asked_group_memberships, :class_name => 'Group_Membership', :conditions => ['status = ?', false]
  has_many :members, :class_name => "Person", :through => "group_memberships", :foreign_key => "member_id", :conditions => ['group_memberships.status = ?', true]
end
person Anton    schedule 19.05.2011
comment
Спасибо за Ваш ответ! Дело own_group уже сделано и работает нормально через FK в групповой таблице (person_id). Все, что я хочу, это способ заставить этого владельца группы видеть все существующие в его группе group_memberships и принимать или отклонять их. - person Zeroz; 19.05.2011
comment
Какая проблема? Person.first.groups.first.group_memberships, нет? - person Anton; 20.05.2011