【问题标题】:Dynamically add/modify activerecord associations动态添加/修改活动记录关联
【发布时间】:2011-04-22 09:36:13
【问题描述】:

我认为 ActiveRecord 的情况不会是一个独特的情况,但我似乎找不到任何有类似问题的人,所以这里是:

我有一个用户类和一个定义用户能力的角色类。例如,您可以有一个角色为“tutor”的用户、一个角色为“student”的用户,以及一个角色为 ['tutor', 'student'] 的用户:

class User < ActiveRecord::Base
  has_many :roles
end

class Role < ActiveRecord::Base

end

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

子类化 User 似乎也是错误的——我想过做 Tutor

我考虑过这样做:

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

但我不知道这是否被认为是错误的,或者我什至不知道如何让它发挥作用。处理这种带有关联的用户/角色设置的最佳方法是什么?

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案1】:

    我会为您的问题推荐一颗宝石。查看相关的 SO 问题:Recommendation for Role Gem

    【讨论】:

    • 感谢您的回复。我不确定这些是否能解决我的问题。然而,我可能只是在制造这个问题。我担心的是 User 模型会有很多关联,其中一些可能与当前用户实例无关 - 也许这没关系?
    【解决方案2】:

    我会做以下事情:

    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
    

    【讨论】:

    • 感谢您的回复。我不确定这是否有效?对于用户实例,如果用户具有学生角色,我希望能够进入 user.courses,如果用户具有导师角色,则能够进入 user.subject。其他表,如课程,是用 user_id 映射的,而不是 role_id ......我想我可以用 user_role 进行映射,然后去 user.roles.tutor.something,但这似乎很棘手。是这个意思吗?
    • 我认为这是满足“用户具有多个角色”要求的最佳方法。
    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多