【问题标题】:Optional or Conditional model associations in RailsRails 中的可选或条件模型关联
【发布时间】:2011-10-11 22:33:14
【问题描述】:

我有一个用户模型。 用户可以拥有 3 个角色中的 1 个:role1、role2、role3。这由用户模型中的“角色”列表示。 每个角色都有一个独特的个人资料。角色 1_profile、角色 2_profile、角色 3_profile。每个 *_profile 都是一个模型。

如何在 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

但这不起作用。这样做的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails activerecord associations belongs-to has-one


    【解决方案1】:

    关联不是有条件的。保持这种状态可能也是最容易的。

    User 和各种角色配置文件之间建立多态关联怎么样?

    class User
      belongs_to :role_profile, :polymorphic => true
    end
    
    class RoleXProfile
      has_many :users, :as => :role_profile
    end
    

    当然,您需要将role_profile_idrole_profile_type 字段添加到您的用户表中。

    无论您做什么,都需要检查用户的角色或角色配置文件,无论您在何处使用它。

    【讨论】:

    • 谢谢!我认为你的解决方案是完美的。 Rails 中总有办法,但当你不知道办法时,你往往会以一种奇怪的方式实现解决方案。
    • @jackquack 我不认为你的方法很奇怪。恰恰相反,这是非常合乎逻辑的。它可能很好地指出了 ActiveRecord 可以改进/扩展的地方。无论如何,我很高兴你的工作正常。
    【解决方案2】:

    您可能想考虑使用polymorphic association 并拥有适当的角色配置文件。

    我的理解是 :conditions关联 模型必须满足的条件(但我可能错了)。

    无论如何,我认为你让这件事变得比实际更困难,并且通过使这些关系有条件来混淆你真正需要的东西。

    【讨论】:

    • +1 因为懒惰的程序员是优秀的程序员 :) 以及关于用于关联的条件的注释
    • @WizardofOgz 这就是我一直告诉我的老板的话!我想是……哈姆雷特?谁说“懒惰带来创新”。
    • 你完全正确!我只是给了 Wizard 的信任,因为他包含了代码。 :)
    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多