2009-06-18 1 views
2

アントンが指摘するように(Antonに感謝します)、私の問題はアソシエーションキャッシングテストであり、Factoryでnested_attributeを正しく作成したようです。正しい構文は次のとおりです。accepts_nested_attributes_forを使用してRoRファクトリの関連付けを作成するにはどうすればよいですか?

Factory.define :job do |f| 
    ... 
    f.vehicles_attributes [{:vin => "1", :model => "ford", :make => "escort"},{:vin => "1", :model => "ford", :make => "escort" }] 
end 

私は私の仕事のモデルにaccepts_nested__attributes_forを使用していますが、「備品ダイビング」ほぼ私のビー玉を失った後、工場出荷時の女の子に移行し、私はモデルを変更するたびにしようとしています。

私は以下のコードの束を投稿が、私の質問は簡単です:私はnested_attributesを作成するファクトリを使用するにはどうすればよい

私は以下のコードを使用してジョブインスタンスを作成することができますが、ユニットテストで作成車両を作成することはできません。 f.vehicles_attributes...がなければ、私のジョブテストは検証に失敗します。

私のユニットテストは、次のような結果をもたらす:

test "factory" do 
    job = Factory(:job) 
    assert(job.valid?) # => true 
    assert(job.vehicles.first.valid?) # => true 
    vehicle = Factory(:vehicle) 
    assert(vehicle.job.vehicles.size == 1) # => true 
    assert_equal(vehicle.job.vehicles.first.vin, "2") # => FALSE. <"1"> expected but was <"2"> 
    end 

Factory.define :job do |f| 
    ... 
    f.vehicles_attributes [:vin => "1", :model => "ford", :make => "escort" ] 
end 

Factory.define :vehicle do |f| 
    f.vin "2" 
    f.model "ford" 
    f.make "escort" 
    f.association :job 
end 

class Job < ActiveRecord::Base 
    has_many :vehicles, :dependent => :destroy 
    validate :job_must_have_at_least_one_vehicle 
    accepts_nested_attributes_for :vehicles, :allow_destroy => :true, :reject_if => proc { |vehicle_attributes| Job.insufficient_vehicle_input?(vehicle_attributes) } 

    def job_must_have_at_least_one_vehicle 
    errors.add(:vehicles, "need to be added") if self.vehicles.empty? 
    end 

    def self.insufficient_vehicle_input?(vehicle_attributes) 
    vehicle_property_keys = vehicle_attributes.keys 
    vehicle_property_keys.delete('_delete') 
    vehicle_property_keys.delete('is_operational') 
    vehicle_property_keys.delete('has_keys') 
    vehicle_property_keys.each do |attribute_to_validate| 
     if(!vehicle_attributes[attribute_to_validate].nil? && !vehicle_attributes[attribute_to_validate].empty?) 
     return false 
     end 
    end 
    return true 
    end 
end 
+0

ところで、assert_equalの正しい使用方法は次のとおりです:
だから、あなたが必要とするすべてはjobをリロードすることです assert_equal (予想、実際) –

答えて

2

それはすべてに約関連のキャッシングです。ここで

は、それがどのように動作するかです:
1. Factory(:vehicle)vehicleオブジェクトを構築し、その後job記録
2を作成し、それはそれ

しかしvehicle.jobステップ1からjobオブジェクトを指摘されているvehicle.job_idを満たし、節約します。

vehicle = Factory(:vehicle) 
vehicle.job.reload.vehicles.size # => 2 
関連する問題