【问题标题】:Polymorphic association fails多态关联失败
【发布时间】:2013-01-27 13:05:49
【问题描述】:

在我的 rails 3.2 应用程序中,我有一个用户模型和一个医师模型,它们具有以下多态关联:

用户

class User < ActiveRecord::Base
  attr_accessible :authenticatable_id, :authenticatable_type, :email
  belongs_to :authenticatable, polymorphic: true
end

医师

class Physician < ActiveRecord::Base
  attr_accessible :name
  has_one :user, as: :authenticatable
end

我想在控制台中测试这些并遇到了一个奇怪的事情。正在做:

p = Physician.new
p.user.build

给我NoMethodError: undefined method 'build' for nil:NilClass - 但是为什么医生的用户属性会是nil

奇怪的是,当我将医师模型更改为 has_many :users 而不是 has_one :user 并这样做时

p = Physician.new
p.users.build

一切正常。

要让has_one 关联起作用,我缺少什么?

【问题讨论】:

  • 你可能应该这样做 p.build_user 因为 has_one 没有添加 .build 方法
  • @VadimChumel 太棒了,这正是我所需要的!请将此添加为答案,以便我接受并投票:-)

标签: ruby-on-rails associations polymorphic-associations rails-activerecord has-one


【解决方案1】:

您可能应该使用p.build_user,因为has_one 没有添加association.build 方法。您还可以检查 apidock 关于方法 has_onehas_many 'injects' 到您的模型中。

【讨论】:

    【解决方案2】:

    我并不完全清楚,但您似乎正在创建一个Physician,它也是一个User。因此它能够利用User 提供的功能。

    您的实现创建了两个对象,一个 Physician 和一个User,但是当严格查看情况时,两者都是相同的医师/用户。

    所以你应该让Physician继承自User

    class Physician < User
    

    并去除PhysicianUser之间的多态关系。

    【讨论】:

    • 感谢您的回答!我正在使用 Devise 的用户模型,只需要不同的用户角色。例如,不仅有医生,后来可能还有药房等——但他们都是用户。所以我认为多态关联是正确的方法,我只需要让关联工作......有什么想法吗?
    • 角色可以通过继承来实现。例如class Pharmacy &lt; User 也是有效的。除非您将同时获得具有多个角色的用户...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多