Доступ к дочерним атрибутам родительских фабрик Factory Girl

Я реализую Factory Girl в качестве замены фикстур в моем приложении Rails. У меня есть несколько таблиц, которые я пытаюсь представить с помощью ассоциаций. Однако, чтобы добавить изюминку в цикл, помимо простого определения ассоциаций, мне также необходимо получить доступ к атрибутам дочерних фабрик из родительской.

Ниже приведен пример того, что я пытаюсь сделать:

  • Factory :foo_bar связан с Factory :foo, который связан с Factory :bar
  • Из :foo_bar я пытаюсь получить доступ к атрибутам как :foo, так и :bar

Вот образцы:

Factory.define :bar do |e|
  e.name          "Bar"
end

Factory.define :foo do |e|
  e.bar         {|b| b.association(:bar)}
end

Factory.define :foo_bar do |b|
  f = b.association(:foo)
  b.foo_id      foo.id
  b.bar_id      foo.bar_id
end

Я прошел через ряд руководств и других вопросов и не видел примеров того, как это сделать. Любые идеи или другие способы получения того же результата?

Спасибо!


ИЗМЕНИТЬ

Основываясь на паре вопросов, вот некоторые пояснения, которые я должен был включить изначально...

:foo_bar — это не таблица соединений, а модель с собственными атрибутами.

Это то, что я на самом деле пытаюсь выполнить:

  • заставить :foo_bar создать связанную фабрику
  • затем пусть эта связанная фабрика создаст связанную с ней фабрику
  • (это элемент, с которым я борюсь) иметь :foo_bar доступ к атрибуту с нижнего уровня Factory

Итак, если :foo_bar > :foo > :bar, то из :foo_bar я пытаюсь получить идентификатор :bar.


person shedd    schedule 05.09.2010    source источник
comment
Я не совсем понимаю, что такое :foo_bar. Это просто таблица соединений или у нее есть другие свойства, которых нет в списке?   -  person Peter Brown    schedule 05.09.2010
comment
Привет - спасибо за комментарий. Да, я вижу, как это сбивает с толку из упрощенной версии. :foo_bar имеет другие атрибуты, которые просто не отображаются. Это не сводная таблица.   -  person shedd    schedule 06.09.2010
comment
Это ветка, которую я просматривал, к вашему сведению: группы .google.com/group/factory_girl/browse_thread/thread/   -  person shedd    schedule 06.09.2010
comment
Возможно, вы могли бы обновить :foo_bar после создания Factory нижнего уровня, используя обратный вызов after_create, предоставленный FactoryGirl?   -  person mikezter    schedule 27.09.2010


Ответы (2)


Я использую хук after_build для обработки таких ситуаций:

Factory.define :foo do |f|
  f.name "Foo"
  f.association :foo
  f.after_build do |obj|
    obj.foo_bar = obj.foo.bar
  end
end
person Jon Wood    schedule 05.11.2010

Трудно сказать, как это должно выглядеть без кода модели?

а может как то так?

Factory.define :bar do |f|
    f.name "Bar"
    f.association :foo_bar  
end

Factory.define :foo do |f|
    f.name "Foo"
    f.association :foo_bar  
end

Factory.define :foo_bar do |f|
    f.association :foo
    f.association :bar      
end
person house9    schedule 05.09.2010
comment
Спасибо за ответ. Я думаю, что мой пример не совсем ясно иллюстрирует весь вопрос. Я пересмотрю его, чтобы сделать его более ясным, но на самом деле я пытаюсь сделать так, чтобы :foo_bar создавал связанную фабрику, а затем чтобы эта связанная фабрика создавала свою связанную фабрику, но (и это элемент, с которым я борюсь with) также иметь :foo_bar доступ к атрибуту из фабрики нижнего уровня. Итак, :foo_bar › :foo › :bar и из :foo_bar я пытаюсь получить идентификатор :bar. Это имеет больше смысла? - person shedd; 06.09.2010