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
Działa, jeśli fabryka dostawców zdefiniowana jest w factoryories przed fabryką tandemów. Dzięki! –
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
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ć. –