用户模型和角色

时间:2019-01-10 07:57:18

标签: ruby-on-rails ruby

实现角色的最佳方法是什么?本质上,我想要的是一个用户模型。但是我想要两种不同类型的用户。 1)他们可以购买产品的普通用户。 2)第二个用户是卖方。该用户可以添加和删除产品。

如何向用户添加卖家?我希望买卖双方有相同的设计观点。你能举个例子吗?

目前,我有一个用户模型(设计)和一个产品模型。

4 个答案:

答案 0 :(得分:2)

您可以使用cancancan gem。并在用户表中添加卖方(布尔)列。

然后在capability.rb上

if user.present?
  can :read, Product
end

if user.seller?
 can :manage, Product, user_id: user.id     
end

此操作(假设某产品属于用户)将允许卖方创建/编辑/删除其产品(如果所有卖方共用该产品,则可以删除部分user_id: user.id)。

所有其他(购买者)可以看到所有产品。如果他们购买了,他们可以创建一个订单或任何您要称呼的订单。

答案 1 :(得分:0)

我不知道这是否是最好的方法,但是这里有一个示例,说明如何完成。使用枚举:

 class User < ApplicationRecord

  devise :database_authenticatable, :rememberable, :trackable, :validatable, :lockable,
         authentication_keys: [:login], password_length: 4..32, unlock_strategy: :time

  enum available_roles: {buyer: 100, seller: 101}

  def buyer?
    has_role?(User.available_roles[:buyer])
  end

  def seller?
    has_role?(User.available_roles[:seller])
  end

  def has_role?(role)
    roles.include?(role)
  end

end

要使用许可权(例如只有卖方可以添加和删除产品),可以使用libcancancan https://github.com/CanCanCommunity/cancancan

答案 2 :(得分:0)

您可以将列user_type添加到用户。您可以将默认值设置为buyer,也可以向create/update用户形式提供类型选择列表。

您还可以使用cancancan gem为他们定义权限

答案 3 :(得分:0)

我建议对客户和卖方使用不同的模型和表格,因为它们在逻辑上是不同的实体。 CustomerModel将与您的客户端应用程序交互,而SellerModel将与您的内部应用程序交互。就我而言,这是一种更好的方法。

如果您希望将它们放在单个表中,我建议在用户表中添加类型列,然后使用单个表继承的原理。 STI的好处在于,您可以使代码更加模块化,并在其各自的模型中添加特定于客户和卖方的方法,这些方法又将从UserModel继承。

这里是单表继承的链接,可能会有帮助:Single table inheritance explained

对于访问控制,您可以使用Pundit gem。这是相同的github链接。