2011-10-11 28 views
5

我有一個用戶模型。 用戶可以擁有3個角色中的1個角色:角色1,角色2,角色3。這由用戶模型中的「角色」列表示。 每個角色都有唯一的配置文件。 role1_profile,role2_profile,role3_profile。每個* _profile都是一個模型。Rails中的可選或條件模型關聯

如何在Rails中表示此可選關聯?

我已經試過了兩種不同的方式:

class User < ActiveRecord::Base 
    #FIRST WAY 
    if current_user.role == 'role1' then has_one :role1_profile end 
    #SECOND WAY 
    has_one :role1_profile, :conditions => ['user.role = ?', 'role1'] 
end 

但是,這並不工作。什麼是正確的方法來做到這一點?

回答

4

關聯並不是有條件的。這也可能是最容易的。

如何在User與各種角色配置文件之間建立多態關聯?

class User 
    belongs_to :role_profile, :polymorphic => true 
end 

class RoleXProfile 
    has_many :users, :as => :role_profile 
end 

當然,你需要的role_profile_idrole_profile_type字段添加到您的用戶表。

無論你做什麼,你都需要檢查用戶的角色或role_profile,無論你使用它。

+0

+1因爲我懶得輸入代碼。 –

+0

謝謝!我認爲你的解決方案是完美的。在Rails中總有一種方法,但是當你不知道方式時,你往往以奇怪的方式實現解決方案。 – hrdwdmrbl

+0

@jackquack我認爲你的方法根本不可思議。恰恰相反,這是非常合乎邏輯的。而且它可能會指出ActiveRecord可以改進/擴展的地方。無論如何,我很高興你有事情的工作。 –

4

您可能想要考慮改爲polymorphic association,只需要具有適當的角色配置文件。

我的理解是,:conditions條件相關的模型必須符合(但我可能是錯誤的)。

在任何情況下,我認爲你是通過使這些關係有條件而使它比實際更困難並且混淆了你真正需要的東西。

+0

+1因爲一個懶惰的程序員是一個很好的程序員:)和關於用於關聯的條件的說明 –

+0

@WizardofOgz這就是我一直告訴我的老闆!我認爲這是......哈姆雷特?誰說:「懶惰來創新。」 –

+0

你是絕對正確的!自從他包含代碼以來,我只是給了巫師這個榮譽。 :) – hrdwdmrbl