2011-04-21 66 views
1

我有什么,我倒是觉得不会与ActiveRecord的一个独特的情况,但我似乎无法找到一个类似问题的人,所以这里有云:动态添加/修改ActiveRecord关联

我有一个用户的用户类和定义用户功能的Roles类。对于恩,你可以有一个角色的“导师”,与“学生”的角色的用户,并与一个角色的用户[“导师”,“学生”]用户:

class User < ActiveRecord::Base 
    has_many :roles 
end 

class Role < ActiveRecord::Base 

end 

我想要做的是添加基于角色的activerecord关联。显然,一个学生可能有很多:课程,导师可能有:他们教的科目,学生和导师都可以有很多约会,但似乎并不是将所有这些关联添加到每个用户实例都是正确的要走的路。

子类用户也似乎是错误的 - 我想过做导师<用户和学生用户<,并在每个子类中添加适当的关联,但如果我们有一个学生是一个家教?那我们需要一个StudentTutor课程?如果添加更多角色,这条路线看起来很危险。

我已考虑过做这样的事情:

class User < ActiveRecord::Base 

    protected 

    after_initialize do 
    if self.has_role?(Role::STUDENT) 
     has_many :courses # This does not work 
    else 
     # etc etc etc 
    end 
    end 
end 

但我不知道如果这被认为是错误的或者我怎么连使它发挥作用。处理这种使用关联的用户/角色设置的最佳方法是什么?

回答

0

我会为你的问题推荐一款宝石。看到相关的SO问题:Recommendation for Role Gem

+0

感谢您的答复。我不确定这些解决了我的问题。不过,我可能只是在制造这个问题。我担心的是User模型会有很多关联,其中一些关联可能与当前用户实例无关 - 也许这只是好的? – Ben 2011-04-21 18:28:44

0

我会做到以下几点:

class User < ActiveRecord::Base 
    has_many :roles 
end 

class Role < ActiveRecord::Base 
end 

class Tutor < Role 
    has_one :subject 
end 

class Student < Role 
    has_many :courses 
end 
+0

感谢您的回复。我不确定这是否有效?我想,对于用户实例,如果用户具有学生角色,则能够转到user.course,如果用户具有教师角色,则需要user.subject。其他表,如课程,映射与user_id,而不是一个role_id ...我想我可以制定与user_role映射,然后去user.roles.tutor.something,但似乎hacky。你是这个意思吗? – Ben 2011-04-21 18:30:49

+0

我认为这是符合“有多个角色的用户”要求的最佳方法。 – grzuy 2011-04-22 01:32:21