Rails 关联三个模型

Rails associtating three models

我的 rails 应用程序中有以下模型

class User < ApplicationRecord 
end
class Group < ApplicationRecord 
end
class Role < ApplicationRecord 
end

每个 Group has_many User 有不同的 Role。例如 Group-1User - ARole - AdminGroup-1User - BRole - MemberGroup-2User - ARole - Member。同样,每个 Group 有多个 Users,每个 User 有多个 Role.

请指导我应该使用什么样的关联?

假设一个用户只属于一个组,只有一个角色。

模型中的关联:

class Group < ApplicationRecord 
  has_many :users
end

class User < ApplicationRecord 
  belongs_to :group
  belongs_to :role
end

class Role < ApplicationRecord 
  has_many :users
end

应添加到模型中的列:

用户:

group_id:integer:index
role_id:integer:index

编辑 1:

正在根据评论更新关联。

class Group < ApplicationRecord 
  has_many :users
  has_many :roles
end

class User < ApplicationRecord 
  belongs_to :group
end

class Role < ApplicationRecord 
  belongs_to :group
end

应添加到模型中的列:

用户:

group_id:integer:index

角色:

group_id:integer:index

要查找用户的组和角色,您可以使用:

user = User.last
user.group # Returns group of the user
user.group.roles # Returns roles of the user

Incase,如果用户属于多个组并且角色属于多个用户,我希望以下关联能正常工作...

class Group < ApplicationRecord 
  has_many :group_users
  has_many :users, through: :group_users

  has_many :group_user_roles
  has_many :roles, through: :group_user_roles
end

class User < ApplicationRecord 
  has_many :group_users
  has_many :groups, through: :group_users

  has_many :group_user_roles
  has_many :roles, through: :group_user_roles
end

class GroupUser < ApplicationRecord
    belongs_to :group
    belongs_to :user
end

class Role < ApplicationRecord
end

class GroupUserRole < ApplicationRecord
  belongs_to :user
  belongs_to :group
  belongs_to :role
end

您需要再创建一个 table(GroupUserRole) 来将多个用户与多个群组关联起来,以实现多个角色。

您还可以创建一个 Tri-related table 为用户的每个成员都有一个记录并保存该用户的角色。

class Trirelation
  belongs_to :group
  belongs_to :user
  belongs_to :role
end

class User
  has_many :trirelations
  has_many :groups, through: :trirelations
end

class Group
  has_many :trirelations
  has_many :users, through: :trirelations
end

class Role
  has_many :trirelations
end

如果您需要查询给定用户是否是组的管理员,

@role = Trirelation.find_by(user_id: 1, group_id: 21).role.name