2013-08-05 56 views
3

感謝您的閱讀。Rails 4設計多個用戶模型STI

我正在使用Devise和Rails 4.我想添加多個用戶模型(admin,usertype1,usertype2),以便它們從主用戶模型繼承。我已經搜索了很多帖子,並得出結論,我可以使用CanCan,我不想,或者我可以使用Single Table Inheritance。

我看到它的方式是將類型字符串列添加到我用Devise創建的主用戶模型中。我還需要將父級的每個子級擴展爲:

class Admin < User 
end 

class Usertype1 < User 
end 

class Usertype2 < User 
end 

我的問題是:接下來要做什麼?我如何知道如何訪問類型列?我是否還需要替代current_user輔助方法的設計控制器,例如我可以有current_admin例如?

再次感謝。

回答

1

您還可以使用easy_roles gem。它在github上可用。這個寶石爲您的不同用戶角色提供了一個位掩碼解決方案。你只需要有一個模型,例如用戶,這個模型得到一個屬性「角色」。只需在github上查看文檔即可。 Devise + easy_roles + CanCan是一個非常好的設置,在我看來非常方便。我經常使用它。

鏈接到github上:https://github.com/platform45/easy_roles

+0

謝謝隊友!我已經成功添加到我的項目,他們都工作。現在,我明白easy_roles爲您的用戶模型添加了一個新列。我不明白的是它在哪裏創建子類?它是否這樣做? –

+1

你是什麼意思? STI子類?你不會再需要它們了。您可以定義不同的方法來獲取不同的用戶角色。例如,你定義一個def has_role?(角色)或類似的東西,你可以找回不同的角色。您還可以通過提供的位掩碼解決方案向一位用戶添加多個角色。 – Mattherick

+0

那些子類的數據呢?它存儲在哪裏或者我怎麼能夠爲每個子類添加特定的列?再次感謝 –

3

我不知道這確實解決了原來的問題。我正在嘗試爲Devise設置多個會話控制器,並且它似乎確實需要針對此用例的多個模型。當我有一個工作版本時會回發。

0

STI會給你current_admincurrent_user1current_user2設計方法。

application_controller.rb,創建一個自定義current_user方法是這樣的:

def current_user 
    if current_admin 
     current_admin 
    elsif current_user1 
     current_user1 
    else 
     current_user2 
    end 
    end 
helper_method :current_user 

你需要將routes.rb中的一些工作和定製sessions_controller.rb。看到這裏接受的答案Rails: Using Devise with single table inheritance