升级到Rails4.1后,新的多态关联在与其父关联一起保存时是无效的



从Rails3.2升级到4.1后,以前工作的以下代码现在失败了:

在控制器/规范中:

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

我基本上是在尝试保存帖子及其相关联系人,该联系人应该在运行中创建一个contact_publishment记录。错误出现在新的contact_publishment记录上:"可发布内容不能为空">

型号:

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

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

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

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

从关于设置:通过的文档

如果您要修改关联(而不仅仅是从it(,则最好在联接模型上的源关联。这允许关联的记录将自动创建适当的联接模型记录保存时。

相关内容

最新更新