好的,我在工作時正在進行一次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零)。
在實踐中,請繼續使用寶石,如果你喜歡,可以掃描。但考慮一下爲自己的應用程序邏輯解耦設計的例子。
您正在爲大多數人單獨解決多個問題提供解決方案。您正在嘗試執行角色授權,並在您的數據模型中包含客戶和供應商數據實體。這並不是壞事,但其他程序員的經驗可能會有所不同。 – 2012-04-23 21:09:51