我想知道我是否可以拥有多态关联以及存在验证
假设我有business
模型和address
模型,address
是多态的
class Business< ActiveRecord::Base
has_one :address, as: :addressable
validates_presence_of :address
end
class Address< ActiveRecord::Base
belongs_to :addressable, polymorphic: true
end
是否可以进行验证validates_presence_of :address
?使用此设置创建对象时遇到问题。
首先我要创建一个像这样的业务对象
b = Business.new(name: "Hello23")
b.address = Address.new(street: "House 43 BCD")
b.save!
这不起作用。它给出了undefined method constantize for 0:Fixnum
并且给出错误是有意义的,因为当它试图将地址保存到db时它找不到可寻址的id,因为业务尚未保存且没有指定的ID。
但是从另一边也不可能 - 如果没有地址我就无法保存业务。
处理这种情况的最佳方法是什么?
****除此之外,如果我还希望在地址方面进行验证,就像这样**
validates_presence_of :addressable
我现在已经和这一切斗争了大约2天了。让我们看看你们有什么想法?**
答案 0 :(得分:8)
我认为您的问题与验证代码无关,无论哪种方式都可以。
我可以大胆地建议你可能错误地将地址db表中的addressable_type列设置为整数,而不是字符串:)
答案 1 :(得分:1)
当然有可能。
对于对象创建,这应该有效:
# controller.rb
@business = Business.new
@business.build_address
# view.erb
<%= form_for @business do |f| %>
<%= f.fields_for :address do |address_form| %>
...
<% end %>
<% end %>
另见Using build with a has_one association in rails。
注意:在您的模型中,我建议您使用新的验证格式:
class Business< ActiveRecord::Base
has_one :address, as: => :addressable
validates :address, :presence => true
end
希望这会有所帮助。