Rails - 视图模型关联

时间:2011-05-19 18:55:49

标签: ruby-on-rails ruby-on-rails-3 view models

我有这样的模特:

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参与其中。由于groupsgroup_memberships belongs_to一个person,但group_membershipbelongs_to一个group,我该如何在person#show允许person查看memberships groups person拥有groups的人,以及person membership status 1}}有一个false

## EDIT ##

person此处group为默认值,因为如果所有者edit此状态为true,则{{1}}将被接受,并将其设为{{1}}。

从这个问题中获取的想法:Question about Association and Models on Rails

2 个答案:

答案 0 :(得分:1)

以下是一些伪造的代码,我认为这些代码可以帮助您实现目标: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关系可能是最合适的:通过关系,然后围绕关系可以拥有的不同“状态”创建范围。您也可以在state machine结帐时获得一些帮助。

答案 1 :(得分:0)

我想是那样的

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