我有一個rails應用程序,它有三種不同類型的用戶,我需要它們共享相同的常用配置文件信息。但是,每個不同的用戶本身也具有獨特的屬性。我不確定如何區分不同的領域。Rails Active Record - 如何建模用戶/配置文件場景
- 管理員(網站管理員寬)(/商店的等)
- 所有者
- 會員(如合作社的成員)
我使用色器件認證和cancan授權。因此,我有一個用戶模型,其中包含可應用於用戶的一組角色。這個類看起來這樣:
class User < ActiveRecord::Base
# ... devise stuff omitted for brevity ...
# Roles association
has_many :assignments
has_many :roles, :through => :assignments
# For cancan: https://github.com/ryanb/cancan/wiki/Separate-Role-Model
def has_role?(role_sym)
roles.any? { |r| r.name.underscore.to_sym == role_sym }
end
end
每個用戶都擁有包括個人資料:
- 首先&姓
- 地址信息(城市/ ST/ZIP /等)
- 電話
我不想用這個信息污染User模型,所以我把它扔到Profile模型中。這部分相當簡單。這會把用戶模型弄成這個樣子:
class User < ActiveRecord::Base
# ... devise stuff omitted for brevity ...
# ... cancan stuff omitted for brevity ...
has_one :profile
end
的附加字段是我對如何模型有一些忐忑不安的心情......
如果用戶是管理員,他們將有獨特的領域,如:
- admin_field_a:字符串
- admin_field_b:字符串
- 等
如果用戶是所有者,他們將有獨特的領域...
- stripe_api_key:字符串
- stripe_test_api_key:字符串
- stripe_account_number:字符串
- HAS_ONE:商店#AR Refence到管理員和成員沒有的另一種模式。
如果用戶是一個成員,他們將有一些額外的領域,例如:
- stripe_account_number:字符串
- belongs_to的:商店#商店,他們是
- 成員has_many:note
...
並且Store模型將在成員中包含has_many,因此我們將處理該商店的成員。
問題在於附加字段。我是否將這些設置爲不同的類?把它們放在一個不同的 我目前嘗試了幾種不同的方法來設置它:
一種方法是建立用戶模型作爲聚合根
class User < ActiveRecord::Base
# ...
# Roles association
has_many :assignments
has_many :roles, :through => :assignments
# Profile and other object types
has_one :profile
has_one :admin
has_one :owner
has_one :member
# ...
end
這種方法的好處是用戶模型是根,可以訪問所有內容。如果用戶是「所有者」,那麼「管理員」和「成員」引用將爲零(以及其他可能性的管理員 - 管理員而不是所有者或成員等)。
我在想的另一種選擇是讓從用戶模型,這樣用戶繼承的每種類型:
class User < ActiveRecord::Base
# ... other code removed for brevity
has_one :profile
end
class Admin < User
# admin fields
end
class Owner < User
# owner fields
end
class Member < User
# member fields
end
問題的,這是我正在污染User對象有各類零年代在一個類型不需要另一個類型/等的值的表中。看起來很混亂,但我不確定。
另一種選擇是將每個帳戶類型創建爲根,但將用戶作爲子對象,如下所示。
class Admin
has_one :user
# admin fields go here.
end
class Owner
has_one :user
# owner fields go here.
end
class Member
has_one :user
# member fields go here.
end
與上面的是我不知道如何加載,一旦用戶登錄正確的類中的問題。我有自己的USER_ID,我就可以告訴他們是哪個角色(由於用戶模型中的角色關聯),但我不確定如何從用戶UP轉到根對象。方法?其他?
結論 我有一些不同的方法可以做到這一點,但我不知道正確的「軌」的方法是什麼。在rails AR中對此進行建模的正確方法是什麼? (MySQL後端)。如果沒有一個「正確」的方法,上面最好的是什麼(我也接受其他想法)。
謝謝!
這就是我的答案「標記爲」這工作「,因爲當我測試它時,它工作得很好。謝謝你非常深思熟慮和詳細的迴應Jeffrey。:)然而,經過與Michael Hartl(RailsTutorial.org)諮詢了一些MVP可行的產品)的東西,我決定把所有的配置文件數據放入用戶模型,以簡化與模型的交互。如果MVP證明是成功的是有利可圖的,那我稍後可以解決這個問題。 – 2012-04-04 16:26:44