从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(,则最好在联接模型上的源关联。这允许关联的记录将自动创建适当的联接模型记录保存时。