次のように、has_many ポリモーフィックな Address オブジェクトを持つ Customer モデルがあります。
顧客モデル:
class Customer < ActiveRecord::Base
has_many :mailing_addresses, :as => :addressable, :class_name => 'Address', dependent => :destroy
accepts_nested_attributes_for :mailing_addresses
validates :mailing_addresses, :presence => true
validates_associated :mailing_addresses
end
住所モデル:
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
validate :validate_quota
private
def validate_quota
case addressable_type
when "Customer"
customer = Customer.find(addressable_id)
if customer.mailing_addresses.size >= 3
puts "Adding too many records"
errors.add(:addressable, "Too many records")
end
end
end
また、RSpec を使用して、クォータの制約が尊重されていることをテストしています。したがって、この仕様は合格します。たとえば、次のようになります。
it "observes quota limit" do
customer = FactoryGirl.create(:customer, :number_of_mailing_addresses => 3)
expect {
address = FactoryGirl.create(:mailing_address, :addressable => customer)
}.to raise_error
customer.mailing_addresses.count.should eq(3)
end
どっちがいい。ただし、これはひどく失敗します。
it "fails add if already 3 addresses" do
customer = FactoryGirl.create(:customer, :number_of_mailing_addresses => 3)
expect {
customer.mailing_addresses.create( FactoryGirl.attributes_for(:mailing_address).except(:addressable) )
}.to raise_error
end
アドレスの検証が失敗していることを仕様の出力で確認することもできますが、何らかの理由で「customer.mailing_addresses.create()」でエラーが発生せず、検証の失敗によって 4 番目のアドレス モデルが保存されなくなることもありません。データベース。
私は何が欠けていますか?