我創造有3種可能與第4結束了用戶的應用...的Rails 4.2:基於角色的身份驗證和獨立屬性
- 聯繫
- 提供商
- 會員(病人)
棘手的部分是共享一些常見的屬性,如'first_name'和'last_name',但會有更多不同的屬性。如果他們都共享相同的「用戶」表,那麼我會有太多的'無'列,這不像是好的做法。
這將是一個好方法嗎?有沒有辦法建立基於角色的模型關係?
我的計劃是使用Devise和Pundit,Postgres for DB。
我創造有3種可能與第4結束了用戶的應用...的Rails 4.2:基於角色的身份驗證和獨立屬性
棘手的部分是共享一些常見的屬性,如'first_name'和'last_name',但會有更多不同的屬性。如果他們都共享相同的「用戶」表,那麼我會有太多的'無'列,這不像是好的做法。
這將是一個好方法嗎?有沒有辦法建立基於角色的模型關係?
我的計劃是使用Devise和Pundit,Postgres for DB。
了大量的研究,使用多態關聯後,一個朋友建議提供了一個經由模塊模擬多表繼承更爲簡單的方法的瑰寶。
該寶石被稱爲Active_Record-Acts As。
https://github.com/hzamani/active_record-acts_as
我的設置將類似於這樣:
class User < ActiveRecord::Base
actable
validates_presence_of :first_name, :last_name
def name
"#{first_name} #{last_name}"
end
end
class Member < ActiveRecord::Base
acts_as :user
end
class Provider < ActiveRecord::Base
# In case you don't wish to validate
# this model against User
acts_as :user, validates_actable: false
end
class Hospital < ActiveRecord::Base
has_many :users
end
然後我需要遷移的外鍵..
change_table :products do |t|
t.integer :actable_id
t.string :actable_type
end
創建用戶變得容易..
Member.create(first_name: "Bob", last_name: "Miller")
我會立足於認證 「:actable_type」。
您應該創建一個單獨的用戶模型。而這三個模型(管理,供應商,會員),每個人都應該
belongs_to :user
然後你就可以輕鬆擁有FIRST_NAME或姓氏一樣,
member.user.first_name
或
provider.user.last_name
等
因此,您在創建管理員或提供者或成員時必須創建用戶。設計可以使用用戶模型。對於角色基礎的東西,你可以使用
if current_user.admin?
do something
end
我希望有幫助。
爲所有用戶類型和admin/provider/member的角色屬性使用單個模型/表。然後,您可以對所有人使用相同的登錄表單,並且每次添加新角色時都不必添加更多表格和模型。
我建議您查看CanCanCan創業板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 %>
「change_table:products」是「change_table:users」嗎? – danv