2010-12-10 9 views
5

Wygląda na to, że powinienem był znaleźć oczywistą odpowiedź na ten problem po kilku godzinach pracy w Google i testowania.Zależne atrybuty w fabryce Dziewczyna

Chcę móc ustawić caredate.user_id => provider.user_id w fabryce daredate.

test Błąd:

ActiveRecord::RecordInvalid: Validation failed: User must be same as provider user

Mam walidacji ActiveRecord który działa przy badaniu za pomocą przeglądarki:

class Caredate < ActiveRecord::Base //works fine when testing via browser 
    belongs_to :user 
    belongs_to :provider 

    validates_presence_of :user_id 
    validates_presence_of :provider_id 
    validate :user_must_be_same_as_provider_user 

    def user_must_be_same_as_provider_user 
    errors.add(:user_id, "must be same as provider user") unless self.user_id == self.provider.user_id 
    end 

end 

//factories.rb 
Factory.define :user do |f| 
    f.password "test1234" 
    f.sequence(:email) { |n| "foo#{n}@example.com" } 
end 

Factory.define :caredate do |f| 
    f.association :provider 
    **f.user_id { Provider.find_by_id(provider_id).user_id } //FAILS HERE** 
end 

Factory.define :provider do |f| 
    f.association :user 
end 

Przepraszam jeśli to zostało odebrane wcześniej; Wypróbowałem kilka różnych opcji i nie mogłem go uruchomić.

Aktualizacja: To przechodzi sprawdzanie poprawności, więc jestem coraz bliżej. Mogę włamać się z losową liczbą.

Factory.define :caredate do |f| 
    f.association :user, :id => 779 
    f.association :provider, :user_id => 779 
end 

Odpowiedz

6
Factory.define :caredate do |f| 
    provider = Factory.create(:provider) 
    f.provider provider 
    f.user provider.user 
end 
+0

Działa, jeśli fabryka dostawców zdefiniowana jest w factoryories przed fabryką tandemów. Dzięki! –

+0

Zależność od zamówienia jest dobrym punktem, a jeszcze gorzej, jeśli obie fabryki są zdefiniowane w oddzielnych plikach. W pewnym momencie zastanawiasz się, czy używanie takich urządzeń w takich przypadkach jest bardziej sensowne. – zetetic

+1

To działało, dopóki nie próbowałem odbudować schematu db i ładowania. Wygląda na to, że FactoryGirl szuka stołu. 'rake db: schema: load --trace ... rake przerwany! Tabela "claimaway_development.providers" nie istnieje "[Here] (http://groups.google.com/group/factory_girl/browse_thread/thread/4852f1a129d72839) jest dyskusją, ale nie mogłem tego rozwiązania zadziałać. –

0

Spróbuj ustawić user_id w after_create lub after_build:

Factory.define :caredate do |f| 
    f.after_create { |caredate| caredate.user_id = caredate.provider.user_id } 
end 
+0

Jestem przy założeniu chodziło Ci zmodyfikować istniejący: caredate Factory, w przeciwnym razie pojawia się błąd: caredate dla wielu fabryk. Niestety nie działa. Wierzę, że walidacja nie powiedzie się, gdy spróbuje zapisać obiekt, więc nigdy nie osiągnie etapu "after_create". Dzięki za sugestię. Ciągle próbuję rzeczy. –