Ruby FactoryGirl.create不';我们不能拯救Mongoid关系

Ruby FactoryGirl.create不';我们不能拯救Mongoid关系,ruby,ruby-on-rails-3,mongoid,factory-bot,Ruby,Ruby On Rails 3,Mongoid,Factory Bot,我有两门课: 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: Boolea

我有两门课:

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\u id
字段,因此当我从数据库中读取
User
时,一个关系不起作用

我目前已通过在
User
factory中添加这段代码修复了它:

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
    
    两者都不是默认值


    可能重复的谢谢!你的代码一开始不起作用,但我在块内重写了这样一行:user.preference=create(:preference,user:user),它可以工作。如果我在user类中验证了:preference的存在,你知道该怎么办吗?在执行(:create)回调之前和之后验证失败。哎呀,是的,我忘记了用户。至于验证:您可能需要使用build而不是create。