Я должен передать дополнительные аргументы девочке фабрики, чтобы использоваться в обратном вызове. Что-то вроде этого (но более сложный действительно):
Factory.define :blog do |blog|
blog.name "Blah"
blog.after_create do |blog|
blog.posts += sample_posts
blog.save!
end
end
и затем создайте его с чем-то вроде этого:
Factory.create(:blog, :sample_posts => [post1, post2])
Какие-либо идеи, как сделать это?
Один из вариантов - создать виртуальный аксессор для дополнительных сообщений, которые проверяет ловушка after_create
:
class Blog
has_many :posts
attr_accessible :name, :title, ... # DB columns
attr_accessor :sample_posts # virtual column
end
Factory.define :blog do |blog|
blog.name 'Blah'
blog.after_create do |b|
b.posts += b.sample_posts
b.save!
end
end
Factory(:blog, :sample_posts => [post1, post2])
Другой вариант - использовать build
вместо create
и добавить : autosave
в коллекцию:
class Blog
has_many :posts, :autosave => true
end
Factory.define :blog do |blog|
blog.name 'Blah'
blog.posts { |_| [Factory.build(:post)] }
end
Factory(:blog, :posts => [post1, post2])
#or
Factory.build(:blog, :posts => [unsavedPost1, unsavedPost2])
По-видимому, в настоящее время это невозможно без обходных путей, требующих изменения самой модели. Об этой ошибке сообщается в: http://github.com/gotitbot/factory_girl/issues#issue/49