2012-04-23 96 views
1

我在軌的新手,我想知道我應該怎麼做這樣的事情:軌道的方法來創建複雜的用戶結構

我創建有兩個主要用戶羣的應用程序,讓我們呼喚他們的客戶和供應商。

我應該如何實現這一點,牢記那些similarites和區別:

差異:

  • 從企業角度看這兩個羣體是獨立的,一般客戶是從供應商處購買。
  • 他們主要與不同的模型相關聯,供應商90%的時間使用應用程序的後端和客戶只有前端。
  • 用戶帳戶manamegent是完全不同的

相似之處:

  • 對於這兩個我想用一些基於角色的授權解決方案
  • 他們都登錄
  • (前declarative authorization)。在極少數情況下,通過相同的控制器/視圖與相同的型號進行交互

什麼是最好的解決方案,以保持簡單和乾淨的同時?一個胖客戶模型與客戶和供應商模型相關聯?用重複登錄邏輯分離模型(它如何與聲明性授權一起工作)?單表繼承(又是如何聲明授權)?

+0

您正在爲大多數人單獨解決多個問題提供解決方案。您正在嘗試執行角色授權,並在您的數據模型中包含客戶和供應商數據實體。這並不是壞事,但其他程序員的經驗可能會有所不同。 – 2012-04-23 21:09:51

回答

2

我會創建一個User類來處理授權等任何事情,以及系統中所有用戶具有的其他基本功能。然後創建分別從User繼承的CustomerVendor類,並擁有自己的業務邏輯。 Rails中的STI使其非常簡單 - 創建一個type列,它將自動填充類名稱。

您可以使用像CanCan這樣的寶石分離每種User的權限。

+0

我同意。在User和Role之間添加一個Role類和一個多對多的類。我將該名稱命名爲RoleMembership。我在ApplicationController的before_filter中執行授權。我也有一個表,哪個角色可以訪問哪些控制器。 – 2012-04-23 21:11:24

+0

謝謝我要這麼做,希望STI不會出現使用諸如CanCan或聲明授權等寶石的問題 – fobb 2012-04-24 06:30:25

1

好的,我在工作時正在進行一次StackOverflow中斷,然後工作把我叫走,所以我很快就回復了。你將不得不決定是否要使用STI,

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |table| 
     table.string "type" 
... 

和存儲您的供應商和客戶對象實例的用戶表,或使用多表繼承,你只是簡單的有

class Vendor < ActiveRecord::Base 
    belongs_to :user 
... 
class Customer < ActiveRecord::Base 
    belongs_to :user 
... 

如果您的供應商和/或客戶對象具有特定的狀態數據(例如供應商的銷售代表或客戶的購買歷史記錄),則需要MTI。好的,購買歷史記錄可能是對belongs_to:customer的其他表的連接,但是當用戶可以成爲供應商時,將連接的記錄belongs_to:user看起來可能很尷尬。

現在,爲了配合訪問控制,...我已經實現了access_control_items表,

class CreateAccessControlItems < ActiveRecord::Migration 
    def change 
    create_table "access_control_items", :force => true do |table| 
     table.timestamps 
     table.string "controller" 
     table.string "action" 
     table.string "group_type", :null => false 
     table.integer "group_id", :null => false 
    end 
    end 
end 

關鍵的一點是,我從角色的訪問控制分離的成員,並使其多態的,所以它可能是成員的任何物品與包括哪些?(用戶)方法。我的應用程序控制器在方法之前將當前登錄的用戶發送給包含?由控制器和操作的任何access_control_items匹配引用的組的方法。

因此,該組可能指向某個ActiveRecord類的實例,如果該用戶是供應商(在STI中具有type =「Vendor」或has_one,那麼該類可能會響應true以包含?(用戶) :供應商不是在MTI零)。

在實踐中,請繼續使用寶石,如果你喜歡,可以掃描。但考慮一下爲自己的應用程序邏輯解耦設計的例子。