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进行
| 归档时间: |
|
| 查看次数: |
856 次 |
| 最近记录: |