【问题标题】:After upgrading to Rails 4.1, new polymorphic associations are invalid when saving them along with their parent升级到 Rails 4.1 后,新的多态关联在与父级一起保存时无效
【发布时间】:2014-07-14 08:33:25
【问题描述】:

从 Rails 3.2 升级到 4.1 后,以下以前可以工作的代码现在失败了:

在控制器/规范中:

post = user.posts.build
post.contacts << contact # contact is a persisted record
post.save! # now fails

我基本上是在尝试保存帖子及其关联的联系人,这应该会即时创建 contact_publishment 记录。 错误出现在新的contact_publishment 记录中:“Publishable can't be blank”

型号:

class Contact
  ...
  has_many :contact_publishments
  ...
end

class ContactPublishment
  ...
  belongs_to :publishable, polymorphic: true
  belongs_to :contact
  validates_uniqueness_of :publishable_id, :scope => [:contact_id, :publishable_type]
  validates_presence_of :contact, :publishable
  ...
end

class Post
  ...
  has_many :contact_publishments, as: :publishable
  has_many :contacts, through: :contact_publishments
  ...
end

【问题讨论】:

  • 您在save!&lt;&lt; 行收到错误?
  • 有助于查看您的验证
  • 好的。我会编辑它们。但关键是这段代码在 Rails 3.2 上完美唤醒,更新搞砸了。此外,对于类似的非多态关系,我不会遇到这些问题。

标签: ruby-on-rails ruby-on-rails-4 has-many-through polymorphic-associations


【解决方案1】:

在 Rails 3.2 中,所有者模型在执行验证嵌套关联之前已保存,在 4.1 中在模型保存之前进行验证,并且由于未保存帖子,因此验证

class ContactPublishment
    validates_presence_of :publishable

不允许通过验证(帖子未保存在数据库中)

为了解决这个问题,您可以在 Post 模型中禁用验证,(ContactPublishment 上的验证已从 Contact 模型调用)

class Post < ActiveRecord::Base
      has_many :contact_publishments, as: :publishable, validate: false

或像这样替换存在验证:

class ContactPublishment < ActiveRecord::Base
  validates_associated :publishable

change_column :contact_publishments, :publishable_type, :string, null: false
change_column :contact_publishments, :publishable_id, :integer, null: false

或者通过 proxy_association 来做

【讨论】:

  • 谢谢!有效!除了change_table 命令,我必须将其更改为change_column。非常感谢,我被困了几天。
  • 当然是change_column,他写的时候想到了ALTER TABLE。谢谢!
  • 哇,这对他们来说在 Rails 中改变真是一件很奇怪的事情......:P
【解决方案2】:

我认为关联没有更新,因为您没有在contact和contact_publishment之间设置inverse_of

From the docs about setting up a :through

如果您要修改关联(而不是仅仅从 它),那么最好设置 :inverse_of 选项 连接模型上的源关联。这允许关联的记录 将被构建,它将自动创建适当的连接模型 保存时的记录。

【讨论】:

  • 试过了,没用。无论如何,问题不在于contact,而在于contact_publishmentpost。此外,inverse_of 不适用于多态关联,因此不适用于 post
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
相关资源
最近更新 更多