升级到Rails 4.1后,新的多态关联与其父级一起保存时无效

Yos*_*sho 9 ruby-on-rails has-many-through polymorphic-associations ruby-on-rails-4

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

在控制器/规范中:

post = user.posts.build
post.contacts << contact # contact is a persisted record
post.save! # now fails
Run Code Online (Sandbox Code Playgroud)

我基本上试图保存帖子及其相关的联系人,这应该是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
Run Code Online (Sandbox Code Playgroud)

Vak*_*liy 10

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

class ContactPublishment
    validates_presence_of :publishable
Run Code Online (Sandbox Code Playgroud)

不允许通过验证(post未保存在db中)

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

class Post < ActiveRecord::Base
      has_many :contact_publishments, as: :publishable, validate: false
Run Code Online (Sandbox Code Playgroud)

或者像这样替换在线验证:

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
Run Code Online (Sandbox Code Playgroud)

或通过proxy_association进行