我有两个类:
class User
include Mongoid::Document
has_one :preference
attr_accessible :name
field :name, type: String
end
class Preference
include Mongoid::Document
belongs_to :user
attr_accessible :somepref
field :somepref, type: Boolean
end
我有两个工厂:
FactoryGirl.define do
factory :user do
preference
name 'John'
end
end
FactoryGirl.define do
factory :preference do
somepref true
end
end
创建User
后,两个文档都保存在数据库中,但是Preference
字段user_id
缺少文档,因此当我从数据库中读取User
时has_one关系不起作用。
我目前通过在工厂中添加这段代码来修复它User
:
after(:create) do |user|
#user.preference.save! #without this user_id field doesn't get saved
end
谁能向我解释为什么会发生这种情况,有更好的解决方法吗?
Mongoid似乎缺乏支持。
当FactoryGirl创建一个用户时,它首先必须为该新用户创建首选项。由于新用户还没有 id,因此首选项也无法存储它。
通常,当您尝试在一个操作中创建父模型和子模型时,您需要两个步骤:
- 创建父级,保存到数据库,以便它获得一个 ID。
- 为父级创建子项并保留它。
第二步将最终进入 after(:create) 块。喜欢这个:
FactoryGirl.define do
factory :user do
name 'John'
after(:create) do |user|
preference { create(:preference, user: user) }
end
end
end
如本回答所述:
确保始终可以立即读回您刚刚的数据 使用
Mongoid
编写,需要设置数据库会话选项consistency: :strong, safe: true
两者都不是默认值。