Rails - 视图模型关联

Posted

技术标签:

【中文标题】Rails - 视图模型关联【英文标题】:Rails - Model Association on Views 【发布时间】:2011-05-19 18:55:48 【问题描述】:

我有这样的模型:

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_membership 还有belongs_to 一个group,我怎样才能在person#show 中创建一个视图,允许person 看到谁问过对于memberships 上的groupsperson 自己,还有什么groupsperson 有一个membership

##EDIT##

这里的status 默认为false,因为如果所有者edit 此状态并将其设置为truegroup 将只接受person

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

【问题讨论】:

我没有看到一个关系来定义谁要求成为一个组的成员......只是谁已经拥有一个......这只是一个缺失的模型或关系。如果我有这些信息,我可能会更好地回答你的问题。 这就是状态进入的地方:如果它为假,则会员资格尚未被接受。组的所有者将通过将状态更新为 true 来接受组中的人,或者通过删除模型来拒绝。 哎呀。读书是我的朋友。对此感到抱歉。 【参考方案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 关系可能最适合作为 :through 关系,然后围绕该关系可能具有的不同“状态”创建范围。您也可以查看state machine 以获得一些帮助。

【讨论】:

感谢您的回答!好吧,我在想一些非常简单的事情……难道没有办法在不更改代码和数据库的情况下达到我的目标吗? 您当前的代码如何知道组所有者以及其他成员是否是该组的批准关系? group_owner 是已知的,因为 Group 有一个名为 person_id 的 FK。我对关系的想法只是用status 做一个简单的事情,我不在乎关系是否总是在模型group_membership 上创建,我的想法是尝试在视图上过滤它并只显示那些与status true 或类似的东西。我从堆栈中的另一个问题中得到了这个想法,***.com/questions/6038298/… 我在想一个组可能有很多所有者出于某种原因。我想我读得不好。如果您已经有一个状态列,那么您只需将 group_membership 模型中的范围更改为范围 :requested, :where(:status => 'approved')【参考方案2】:

我是这么认为的

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_id) 上的 FK,own_group 的事情已经完成并且工作正常。我想要的只是让组的这个所有者看到他的组中存在的所有 group_memberships 并接受或拒绝它们。 什么问题? Person.first.groups.first.group_memberships,不是吗?

以上是关于Rails - 视图模型关联的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中使用 Cloudinary 将直接上传字段与模型相关联?

在链接到 Rails 中的模型视图时需要一些帮助

Rails -> 部分视图的操作方法

Rails 5 - 使用多态关联 - 渲染视图

如何构建 Rails 视图以编辑关联的数据集

Rails 跨多个模型搜索