与验证的多态关联[甚至可能??]

时间:2012-05-21 19:30:19

标签: ruby-on-rails-3 validation activerecord

我想知道我是否可以拥有多态关联以及存在验证

假设我有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天了。让我们看看你们有什么想法?**

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

希望这会有所帮助。