Ruby on Rails -将类划分为多个类

2o7dmzc5  于 2023-02-12  发布在  Ruby
关注(0)|答案(1)|浏览(108)

我有这个应用程序:任务管理器。
我有一个User

  • 用户可以创建一个或多个Groups-〉,然后成为所创建组的admin
  • 同时,用户可以只是另一个用户创建的组的Member(用户和组之间的中间表)。

所以我有这个用户:

has_many :groups, foreign_key: :admin_id, dependent: :destroy
has_many :groups, through: :members

现在我想问民建联:

  • 给我用户是admin的组
  • 给我user只是一个用户的组

我很可能会为此创建一个SQL查询,但我认为会有一个更Rails的方式来做事情。
有什么办法可以做到这一点吗?我只能想到有用户,但同时将其分为2个不同的子类,如UserAdmin和NormalUser。但我不知道如何做到这一点,甚至如果它是正确的方法。
先谢谢你!

pxq42qpu

pxq42qpu1#

将用户类拆分为多个类并不是解决方案,因为您希望用户能够在不同的组中拥有不同的角色。

1.添加外键列

如果要在用户和组之间建立特定的一对多关联,可以添加单独的关联:

class AddCreatorToGroups < ActiveRecord::Migration[7.0]                                                                   
  def change
    # note that you'll have to worry about filling this 
    # column if you have existing data                                                                                                                
    add_reference :groups, :founder, null: false, foreign_key: { to_table: :users }                                                      
  end                                                                                                                   
end 

class Group
  # ...
  belongs_to :founder, 
    class_name: 'User',
    inverse_of: :groups_as_founder
end

class User
  # ...
  has_many :groups_as_founder,
    class_name: 'Group',
    foreign_key: :founder_id,
    inverse_of: :founder
end

如果您需要能够非常高效地立即加载组和该用户,这是一个好主意。这将在创建组时设置:

def create
  @group = Group.new(group_params) do |group|
    group.founder = current_user
  end
  # ...
end

这可以与其他选项结合使用。它不能解决您要为一个组分配多个管理员的情况。

2.将角色添加到成员资格

一个一个二个一个一个一个三个一个一个一个一个一个一个四个一个一个一个一个一个五个一个
这是一个大大简化的示例,其中可用角色通过成员资格表上的枚举来定义。一个更复杂的示例可以将角色定义为role_id,并指向一个单独的表。
通过在Membership.roles.key上循环,可以在一定程度上避免这种重复。
需要考虑的一件事是,它将很多责任放到了Membership类中。

3.独立的角色系统。

另一种选择是使用一个单独的系统,如Rolify和一组完全不同的表来存储组中的角色。如果你稍微搜索一下,有很多关于如何使用Rolify或从头开始构建基于角色的访问系统的教程。

相关问题