2011-05-04 70 views
2

我是一個新的Ruby用戶,並且搜索了論壇,儘管發佈了類似的問題,但我無法完全關聯。因此,我的問題。登錄多個用戶類型

我有一個網站,有2個不同類型的用戶具有不同的和共享的屬性(購物者&商店)兩個都應該能夠登錄,但將在整個網站有不同的功能和導航欄選項。他們也將分享一些功能。例如,兩者都應該能夠在商店中搜索數據。但是,只有商店才能夠更新其中的數據。

我最初創建了一個帶有email,encrypted_pa​​ssword,salt等的用戶類。我想利用註冊/登錄代碼。但是每種類型的用戶都會有額外的功能。

我認爲有以下數據庫:

create_table :users do |t| 
     t.string :email 
     t.string :encrypted_password 
     t.string :salt 
     t.timestamps 
end 

create_table :shoppers do |t| 
    t.integer :dollars 
    t.string :promo_info 
end 

create_table :stores do |t| 
    t.string :address 
    t.string :city 
    t.string :zipcode 
    t.string :category_id 
end 

然後,我將有一個購物&存儲類,將從用戶類繼承,獲得所有定義有登錄/註冊功能。或者它會更有意義,只是讓每個商店都有一個用戶,並將任何身份驗證調用委託給它shopper.user.login()

我在想這個問題嗎?

回答

0

是的,你正在考慮這個正確的imho。

這是一個真正的OOD的問題:你問是否使用組成(存儲類有一個用戶)或inheritenace(商鋪類用戶)。構圖被廣泛認爲是更好的設計選擇。我建議你谷歌composition vs inheritance欲瞭解更多信息。

就你而言,我認爲構圖更有意義。 User類實現的身份驗證功能與Store或Shopper實現的功能沒有直接關係。此外,商店邏輯上可以有多個用戶:商店的多名員工,可能具有不同的授權級別,訪問您的系統。

+0

背景:我是由java開發人員的經驗,雖然已經練了幾年了。我已閱讀文章,並傾向於同意(作文)。 但是,不是爲什麼這是一個奇怪的問題,但我應該怎麼想。我很欣賞這些反饋。 – 2011-05-19 18:04:21

+0

我寫了OOD(如面向對象設計),不奇怪;) – Elad 2011-05-19 20:10:37

0

你真正想要的是單表繼承。你也不需要任何多態關聯。

class User < ActiveRecord::Base; end 
class Store < User; end 
class Shopper < User; end 

在相應子類的用戶和商店/購物者專用邏輯中實現與用戶相關的方法和驗證。

你的控制器和視圖是完全另一個交易。您可能需要命名空間「商店」,並在該名稱空間內維護一組單獨的控制器和視圖,以獲取商店將擁有的所有特殊視圖和功能(並且購物者不會)。然後默認情況下(和路線/路徑)是購物者。

resources :products, :only => [:index, :show] 

namespace :shoppers do 
    resources :products 
end 

運行rake routes,你會看到你得到了什麼。