Документите от Factory Girl предлагат този синтаксис за създаване (предполагам) асоциации родители-деца ...
Factory.define :post do |p|
p.author {|a| a.association(:user) }
end
Публикацията принадлежи на Потребител (нейния "автор").
Какво става, ако искате да определите Фабрика за създаване User
s, които имат куп Post
с?
Или какво ще стане, ако това е ситуация много към много (вижте актуализация по-долу например)?
UPDATE
Мислех, че съм го измислил. Опитах това ...
Factory.define(:user) do |f|
f.username { Factory.next(:username) }
# ...
f.roles { |user|
[
Factory(:role),
Factory(:role, {:name => "EDIT_STAFF_DATA"})
]
}
end
Първоначално изглеждаше, че работи, но след това получих грешки при валидиране, защото F.G. се опитваше да спаси потребителя два пъти със същото потребителско име и имейл.
Така че се връщам към първоначалния си въпрос. Ако имате връзка между мнозина, както кажете Users
и Roles
, как можете да определите фабрика, която ще се върне Users
с някои свързани Roles
? Отбележи, че Roles
трябва да е уникален, така че не мога да имам F.G. създаване на нов „ADMIN“ Role
в БД всеки път, когато създава a User
.
Отговори:
5 за отговор № 1Не съм сигурен дали това е най-правилният начин да го направите, но работи.
Factory.define(:user) do |u|
u.login "my_login"
u.password "test"
u.password_confirmation "test"
u.roles {|user| [user.association(:admin_role),
user.association(:owner_role, :authorizable_type => "User", :authorizable_id => u.id) ]}
end
4 за отговор № 2
Виж: http://railsondave.blogspot.com/2009/05/creating-hasmany-through-factories-with.html
1 за отговор № 3
Скорошно актуализация на момичето фабрика позволява асоциации да бъдат зададени с блокове за обратно извикване
1 за отговор № 4
Създадох един active_factory плъгин, която се занимава с вашата ситуация в спецификации като тази:
models { user - posts(3) }
Ако има интерес, може да се опитам да създам интеграция с factory_girl фабрики.