实现角色的最佳方法是什么?本质上,我想要的是一个用户模型。但是我想要两种不同类型的用户。 1)他们可以购买产品的普通用户。 2)第二个用户是卖方。该用户可以添加和删除产品。
如何向用户添加卖家?我希望买卖双方有相同的设计观点。你能举个例子吗?
目前,我有一个用户模型(设计)和一个产品模型。
答案 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链接。