Factory Girl + Mongoid 在夹具中嵌入文档
Posted
技术标签:
【中文标题】Factory Girl + Mongoid 在夹具中嵌入文档【英文标题】:Factory Girl + Mongoid embedded documents in fixtures 【发布时间】:2011-11-24 01:32:14 【问题描述】:假设您有以下 mongoid 文档:
class User
include Mongoid::Document
embeds_one :name
end
class UserName
include Mongoid::Document
field :first
field :last_initial
embedded_in :user
end
如何创建一个工厂女孩工厂来初始化嵌入的名字和姓氏首字母?另外,您将如何处理 embeds_many
关系?
【问题讨论】:
【参考方案1】:我也在寻找这个,在研究过程中,我偶然发现了很多代码并将它们拼凑在一起(但我希望有更好的文档),但这是我的部分代码。 Address 是 1..1 关系,Phones 是 1..n 关系到事件。
factory :event do
title 'Example Event'
address FactoryGirl.build(:address)
phones [FactoryGirl.build(:phone1), FactoryGirl.build(:phone2)]
end
factory :address do
place 'foobar tower'
street 'foobar st.'
city 'foobar city'
end
factory :phone1, :class => :phone do
code '432'
number '1234567890'
end
factory :phone2, :class => :phone do
code '432'
number '0987654321'
end
(对不起,如果我不能提供我的链接,他们有点搞砸了)
【讨论】:
谢谢。我只是浪费了几个小时来追踪这个问题。 请注意,phones 属性是一个数组(FactoryGirl 调用被 [] 包围)。您不需要多个 :phone,但如果关系是 embeds_many,它必须是一个数组。这个细节花了我大约 4 个小时!【参考方案2】:这是一个允许您动态定义嵌入对象数量的解决方案:
FactoryGirl.define do
factory :profile do
name 'John Doe'
email 'john@bigcorp.com'
user
factory :profile_with_notes do
ignore do
notes_count 2
end
after(:build) do |profile, evaluator|
evaluator.notes_count.times do
profile.notes.build(FactoryGirl.attributes_for(:note))
end
end
end
end
end
这允许您调用 FactoryGirl.create(:profile_with_notes)
并获得两个嵌入的注释,或者调用 FactoryGirl.create(:profile_with_notes, notes_count: 5)
并获得五个嵌入的注释。
【讨论】:
以上是关于Factory Girl + Mongoid 在夹具中嵌入文档的主要内容,如果未能解决你的问题,请参考以下文章
在具有唯一约束的关联中使用 Rails 中的 factory_girl。得到重复的错误
ruby enable_factory_girl_on_dev.rb