工厂女孩.创建不保存Mongoid关系



我有两个类:

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,因此首选项也无法存储它。

通常,当您尝试在一个操作中创建父模型和子模型时,您需要两个步骤:

  1. 创建父级,保存到数据库,以便它获得一个 ID。
  2. 为父级创建子项并保留它。

第二步将最终进入 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

两者都不是默认值。

相关内容

  • 没有找到相关文章

最新更新