2010-01-13 12 views
6

Mam problem, w którym mam model nadrzędny Foo, który zarówno has_many :bars i has_many :bazes. Wreszcie mam również model łączenia BarBaz, który belongs_to :bar i belongs_to :baz. Chcę sprawdzić wszystkie bar_bazes tak, aby pasek i baz zarówno należały do ​​tego samego foo. Ale nie potrafię wymyślić sposobu na zdefiniowanie fabryki dla tego modelu, która byłaby ważna.validations factory_girl

Factory.define(:bar) do |bar| 
    bar.association(:foo) 
end 

Factory.define(:baz) do |baz| 
    bar.association(:foo) 
end 

Factory.define(:bar_baz) do |bar_baz| 
    baz_bar.association(:foo) 
    baz_bar.association(:bar) 
    baz_bar.association(:baz) 
end 

uzyskać nieprawidłowy rekord błąd podczas próby utworzenia tego ostatniego, ponieważ bar i Baz factory_girl próbuje powiązać to każdy z nich ma swój własny foo. Czy jestem skręcony?

Odpowiedz

5

Więc po wielu godzinach bicia mojej głowy w tej kwestii, myślę, że w końcu mam rozwiązanie. To całkiem szalone, więc mam nadzieję, że ktoś jeszcze może mi pokazać, gdzie jestem głupi.

Factory.define :foo do |foo| 
end 

Factory.define :bar do |bar| 
end 

Factory.define :baz do |baz| 
end 

Factory.define :foo_with_baz do |foo| 
    foo.after_create { |foo| Factory(:baz, :foo => foo) } 
end 

Factory.define :bar_baz do |bar_baz| 
    bar_baz.bar {|bar| bar.association(:bar, :foo => Factory(:foo_with_baz)) 
    bar_baz.after_build {| bar_baz| bar_baz.baz_id = bar_baz.foo.bars.first.id } 
end 

Kluczową kwestią jest, że nie musi być foo w bazie danych można uzyskać już w fabrykach przez sam, ponieważ można używać zmiennych lokalnych lub dowolnego kodu ruby ​​w factories.rb (o ile mi móc powiedzieć).

+0

to całkiem imponująca praca. Świetna robota – Trip

+0

Cóż, to nie może być takie wspaniałe, ponieważ po powrocie do niego po kilku miesiącach nie pamiętam co do cholery robiłem. :) – tfwright

0

Szaleństwo tworzenia fabryk z głęboko zagnieżdżonymi skojarzeniami doprowadziło mnie do stworzenia fixie, która pozwala tworzyć rekordy testowe przy użyciu ActiveRecord. Działa podczas kroku db:test:prepare. Używam go, aby wyeliminować potrzebę urządzeń. Możesz nadal używać fabryk do łatwiejszych do zbudowania obiektów.

+0

Naprawdę to lubię, ale dlaczego nie możemy sprawić, aby nasze rozwiązanie fabryczne pozwalało na dowolny kod Ruby w definicjach Factory? – tfwright

+0

Możesz do pewnego stopnia. Sztuczka, którą trzeba obejść, polega na tym, że fabryki są nazywane wiele razy i muszą za każdym razem tworzyć prawidłowy obiekt. To staje się nieporządne ze skojarzeniami. –

Powiązane problemy