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まだ保存されておらず、IDが割り当てられていないため、アドレスをdbに保存しようとすると、アドレス可能なIDが見つからないため、エラーが発生します。 。

しかし、反対側からもそれは不可能です-私は住所がなければビジネスを救うことはできません。

このような状況に対処するための最良の方法は何ですか?

****これとは別に、このようにアドレス側でも検証を行いたい場合はどうなりますか**

validates_presence_of :addressable

私はこのすべてに約2日間苦労しています。あなたの人々がどんなアイデアを持っているか見てみましょう?**

4

2 に答える 2

9

あなたの問題は検証コードとは何の関係もないと思いますが、どちらにしても問題ありません。

アドレスdbテーブルの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 に答える