Учитывая следующие
class User < ActiveRecord::Base
has_and_belongs_to_many :companies
end
class Company < ActiveRecord::Base
has_and_belongs_to_many :users
end
как вы определяете фабрики для компаний и пользователей, включая двунаправленную ассоциацию? Вот моя попытка
Factory.define :company do |f|
f.users{ |users| [users.association :company]}
end
Factory.define :user do |f|
f.companies{ |companies| [companies.association :user]}
end
теперь я пытаюсь
Factory :user
Возможно, неудивительно, что это приводит к бесконечному циклу, поскольку фабрики рекурсивно используют друг друга для определения себя.
Что еще более удивительно, я нигде не нашел упоминания о том, как это сделать, есть ли шаблон для определения необходимых фабрик или я делаю что-то в корне неправильно?
С тех пор Factorygirl была обновлена и теперь включает обратные вызовы для решения этой проблемы. Взгляните на http://robots.oughttbot.com/post/254496652/aint-no-calla-back-girl для получения дополнительной информации.
источник
after(:create)
вместоafter_create
фабричной девушки, как упоминалось здесь: stackoverflow.com/questions/15003968/…На мой взгляд, просто создайте две разные фабрики, например:
Когда вы пишете тестовые примеры для пользователя, просто напишите так
Надеюсь, это сработает.
источник
Я не смог найти примера для вышеупомянутого случая на предоставленном сайте. (Только 1: N и полиморфные ассоциации, но без habtm). У меня был похожий случай, и мой код выглядит так:
источник
Что сработало для меня, так это установка ассоциации при использовании factory. Используя ваш пример:
источник
Нашел этот способ красивым и многословным:
источник
foos { |a| [a.association(:foo)] }
мне очень помогает! Спасибо!Предупреждение: измените пользователей: [user] на: users => [user] для ruby 1.8.x
источник
after_create { |company, evaluator| FactoryGirl.create_list(:user, evaluator.users_count, companies: [company]) }
:?Прежде всего, я настоятельно рекомендую вам использовать has_many: through вместо habtm (подробнее об этом здесь ), так что вы получите что-то вроде:
После этого у вас будет ассоциация has_many с обеих сторон, и вы сможете назначить их в factory_girl так, как вы это сделали.
источник
Employment belongs_to :user
иEmployment belongs_to :company
с моделью присоединения , соединяющей одну компанию с одним пользователем?Обновление для Rails 5:
Вместо использования
has_and_belongs_to_many
ассоциации вы должны рассмотреть:has_many :through
ассоциацию.Пользовательская фабрика для этой ассоциации выглядит так:
Аналогичным образом можно создать фабрику компании.
Как только обе фабрики настроены, вы можете создать
user_with_companies
фабрику с помощьюcompanies_count option
. Здесь вы можете указать, к скольким компаниям принадлежит пользователь:create(:user_with_companies, companies_count: 15)
Вы можете найти подробное объяснение ассоциаций фабричных девушек здесь .
источник
Для HABTM я использовал черты характера и обратные вызовы .
Допустим, у вас есть следующие модели:
Вы можете определить Factory выше :
источник
Вы можете определить новую фабрику и использовать обратный вызов after (: create) для создания списка ассоциаций. Посмотрим, как это сделать на этом примере:
Атрибут companies_count является временным и доступен в атрибутах фабрики и в обратном вызове через оценщик. Теперь вы можете создать пользователя с компаниями с возможностью указать, сколько компаний вы хотите:
источник