2009-06-18 12 views
2

Als Anton darauf hinweist (danke Anton!), Ist mein Problem Assoziations-Caching in den Tests und es scheint, als hätte ich das Nested_Attribute in der Factory korrekt erstellt. Die korrekte Syntax ist:Wie erstellen Sie RoR Factory-Verknüpfungen mit access_nested_attributes_for?

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

ich accepts_nested__attributes_for in meinem Job Modell verwenden und ich versuche, nach fast ins Werk Mädchen zu wandern meine Murmeln „Befestigung Tauchen“ verlieren jedes Mal, wenn ich das Modell ändern.

gab ich eine Reihe von Code unter, aber meine Frage ist einfach:

Wie verwende ich Fabriken nested_attributes zu schaffen?

Ich kann eine Job-Instanz mit dem folgenden Code erstellen, aber ich kann in meinen Komponententests keine Create-Fahrzeuge erstellen. Ohne die f.vehicles_attributes... fehlgeschlagen meine Job Tests Validierungen.

My Unit-Tests erzeugen die folgenden Ergebnisse:

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

Btw, die korrekte Verwendung von assert_equal ist: assert_equal (erwartet, tatsächlich) –

Antwort

2

Es geht um Verein Caching.

Hier ist, wie es funktioniert:
1. Factory(:vehicle) baut vehicle Objekt und schafft job Datensatz
2. Danach ist es füllt vehicle.job_id und speichert es

Aber vehicle.job ist ein job Objekt aus Schritt 1 wies darauf hin, . So
, alles, was Sie brauchen, ist job neu zu laden:

vehicle = Factory(:vehicle) 
vehicle.job.reload.vehicles.size # => 2