【问题标题】:Modelling multiple many-many relationships in Rails在 Rails 中建模多个多对多关系
【发布时间】:2012-02-17 06:03:12
【问题描述】:

阅读RailsGuides、此处的一些答案和其他文档后,我仍然对如何建模这种关系感到困惑。

考虑有对象用户和组的模型,其中用户可以是组的普通成员或具有管理权限(创建组、邀请用户、删除用户、删除组)我希望两个对象都有两个多-很多关系。

  • user.memberOfGroups = 用户所属的组列表
  • group.userMembers = 作为组成员的所有用户的列表
  • user.managedGroups = 用户管理的组列表
  • 的特权
  • group.managingUsers = 具有管理权限的用户列表 小组

这行得通吗?

class User < ActiveRecord::Base

  has_many :managedGroups, :class_name => "Group", :foreign_key => "managingUsers"
  has_many :memberOfGroups, :class_name => "Group", :foreign_key => "userMembers"

end

class Group < ActiveRecord::Base

  has_many :managingUsers, :class_name => "User", :foreign_key => "managedGroups"
  has_many :userMembers, :class_name => "User", :foreign_key => "memberOfGroups"

end

我在指南中找到了如何使用脚手架生成模型对象,这对我来说很好,我只想为 POST 和 GET 创建一个基本的 Web 服务。如果以上是正确的,它应该像使用脚手架创建模型然后编辑以包含显示的行一样简单?

【问题讨论】:

    标签: ruby-on-rails database-design


    【解决方案1】:

    一些问题:

    • 成员资格和访问控制应由不同的表建模。
    • 群组管理是否意味着成员资格?
    • 所描述的外键设计只允许每个用户管理一个组/一个组有一个经理。在所有多:多关系中,您将需要第三个连接模型。

    这将是一个很好的起点:

    class User < ActiveRecord::Base
      has_many :users_groups
      has_many :groups, :through => :users_groups
    end
    
    class Group < ActiveRecord::Base
      has_many :users_groups
      has_many :users, :through => :users_groups
    end
    
    class UsersGroup < ActiveRecord::Base # will be the users_groups table
      belongs_to :user
      belongs_to :group
    end
    
    class Permission < ActiveRecord::Base
      belongs_to :user
      belongs_to :group
      validate_presence_of :name # The name of the permission e.g. "manage"
    end
    

    【讨论】:

    猜你喜欢
    • 2018-03-28
    • 2019-03-02
    • 2019-08-21
    • 2013-01-21
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多