我正在创建一个包含 3 种类型用户的应用程序,最终可能会出现第四种用户......
- 管理员
- 提供商
- 成员(member)(患者)
棘手的部分是每个共享一些共同的属性,例如“first_name”和“last_name”,但会有更多不同的属性。如果它们都共享相同的“用户”表,我将有太多的“nil”列,这感觉不是一个好的做法。
解决这个问题的好方法是什么?有没有办法建立基于角色的模型关系?
我的计划是使用 Devise 和 Pundit、Postgres for DB。
最佳答案
对所有用户类型使用单个模型/表,对管理员/提供者/成员使用角色属性。然后,您可以对所有角色使用相同的登录表单,并且无需在每次添加新角色时添加更多表和模型。
我建议查看 CanCanCan gem https://github.com/cancancommunity/cancancan 。您可以根据角色授权用户操作。
# app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role == "admin"
can :manage, :all
elsif user.role == "provider"
can :manage, SomeModel, user_id: user.id
elsif user.role == "member"
can :read, SomeModel
can :read, SomeOtherModel
end
end
end
如果您希望每个角色使用不同的表单字段,只需为这些字段使用部分模板即可。
# app/views/users/_form.html.erb
<%= form_for @user do |f| %>
<%= f.text_field :first_name %>
<%= f.text_field :last_name %>
<%= render "#{@user.role}_fields", f: f %>
<% end %>
# app/views/users/_admin_fields.html.erb
<%= f.text_field :some_field_for_admins_only %>
关于ruby-on-rails - rails 4.2 : Role Based Auth and Separate Attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314934/