2

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

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

4

2 回答 2

9

我认为您的问题与验证码无关,无论哪种方式都可以。

我可以大胆地建议您可能错误地将地址数据库表中的 addressable_type 列设置为整数,而不是字符串:)

于 2012-05-21T20:12:15.517 回答
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 %>

另请参阅在 rails 中使用带有 has_one 关联的构建

注意:在您的模型中,我建议您使用新的验证格式:

class Business< ActiveRecord::Base
  has_one :address, as: => :addressable

  validates :address, :presence => true
end

希望这会有所帮助。

于 2012-05-21T20:12:34.223 回答