I have a user model. Users can have 1 of 3 roles: role1, role2, role3. This is represented by a 'role' column in the user model. Each role has a unique profile. role1_profile, role2_profile, role3_profile. Each *_profile is a model.
How do I represent this optional association in Rails?
I've tried it two different ways:
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
But that开发者_JAVA技巧 doesn't work. What is the right way to do this?
Associations are not intended to be conditional. It's probably easiest to keep things that way, too.
How about having a polymorphic association between User
and the various role profiles?
class User
belongs_to :role_profile, :polymorphic => true
end
class RoleXProfile
has_many :users, :as => :role_profile
end
Of course, you would need to add the role_profile_id
and role_profile_type
fields to your users table.
No matter what you do you will need to check the user's role or role_profile wherever you use it.
You might want to consider a polymorphic association instead and just have appropriate role profiles.
My understanding was that the :conditions
were conditions the associated model must meet (but I could be wrong on that).
In any case, I think you're making this more difficult than it really is and obfuscating what you really need by making these relationships conditional.
精彩评论