1

我創造有3種可能與第4結束了用戶的應用...的Rails 4.2:基於角色的身份驗證和獨立屬性

  • 聯繫
  • 提供商
  • 會員(病人)

棘手的部分是共享一些常見的屬性,如'first_name'和'last_name',但會有更多不同的屬性。如果他們都共享相同的「用戶」表,那麼我會有太多的'無'列,這不像是好的做法。

這將是一個好方法嗎?有沒有辦法建立基於角色的模型關係?

我的計劃是使用Devise和Pundit,Postgres for DB。

回答

1

了大量的研究,使用多態關聯後,一個朋友建議提供了一個經由模塊模擬多表繼承更爲簡單的方法的瑰寶。

該寶石被稱爲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」。

+0

「change_table:products」是「change_table:users」嗎? – danv

1

您應該創建一個單獨的用戶模型。而這三個模型(管理,供應商,會員),每個人都應該

belongs_to :user 

然後你就可以輕鬆擁有FIRST_NAME或姓氏一樣,

member.user.first_name 

provider.user.last_name 

因此,您在創建管理員或提供者或成員時必須創建用戶。設計可以使用用戶模型。對於角色基礎的東西,你可以使用

if current_user.admin? 
    do something 
end 

我希望有幫助。

+0

我絕對傾向於這種方法。我在另一個類似的論壇上讀到,這導致user_session更頻繁地重置,然後出席。你以前試過這種方法嗎?如果是這樣,你遇到過這樣的問題嗎? – shroy

+0

是的,我使用了這種方法。但我還沒有遇到這樣的問題。可能這不是因爲我想這種方法。 –

+0

如果你使用這種方法,請結帳http://stackoverflow.com/a/11956734/673079,以獲取使用user.role多態關聯的很好的解釋。 – psparrow

1

爲所有用戶類型和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 %> 
+0

我唯一關心的是,所有的屬性都在User模型中,這會讓我留下很多'零'列。供應商擁有的會員數量大約是其兩倍。 – shroy

+0

像Rails這樣的框架總是存在權衡。我將權衡有一些空的數據庫列,而不是每次添加角色時必須創建新模型和表的開銷。另外,如果您使用的是設計,而且您希望所有用戶共享相同的註冊,登錄和密碼重置表單,則您將手中的一些工作連接在一起。 – psparrow

+0

如果您有許多字段用於某些角色,則可以將不同的屬性提取爲單獨的角色或每個用戶類型的配置文件模型。只是沒有多個用戶模型進行身份驗證,或者您需要進行一些頭部檢測! – psparrow

相關問題