从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
答案 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选项是个好主意 连接模型上的源关联。这允许相关记录 要构建,它将自动创建适当的连接模型 他们被保存时的记录。