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

时间:2014-05-25 12:40:31

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

从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记录中:&#34;可发布的内容不能为空白&#34;

模特:

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

2 个答案:

答案 0 :(得分:10)

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

class ContactPublishment
    validates_presence_of :publishable

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

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

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

进行

答案 1 :(得分:1)

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

From the docs about setting up a :through

  

如果您要修改关联(而不是仅仅读取   它),然后在上面设置:inverse_of选项是个好主意   连接模型上的源关联。这允许相关记录   要构建,它将自动创建适当的连接模型   他们被保存时的记录。