FactoryGirl has_many 与双向存在验证的关联创建额外记录

FactoryGirl has_many association with two-way presence validation creates extra record

我是 FactoryGirl 的新手,我在处理这个特定用例时遇到了问题,文档中似乎没有涵盖。

我有两个模型,Person 和 Book。一个人有很多书,一本书属于一个人,两者都有一个需要对方在场的验证。 (一本书必须有一个人,一个人至少要有一本书。)

class Person < ActiveRecord::Base
  has_many :books, inverse_of: :person
  validates :books, presence: true
end

class Book < ActiveRecord::Base
  belongs_to :person
  validates :person, presence: true
end

我需要满足模型最低验证要求的 Person 和 Book 工厂。 Person 工厂应该至少创建一本书,Book 工厂应该创建一个 Person。

这是我的工厂:

FactoryGirl.define do
  factory :person do

    transient do
      books_count 1
    end

    after :build do |person, evaluator|
      person.books << FactoryGirl.build_list(:book, evaluator.books_count, person: person)
    end
  end
end

FactoryGirl.define do
  factory :book do
    association :person
  end
end

此代码适用于 FactoryGirl.create(:person)。但是,当我 运行 FactoryGirl.create(:book) 时,会发生以下情况:

  1. 已创建图书记录
  2. 已创建人员记录
  3. Person 工厂创建了第二条不需要的图书记录。

如果我将 Book factory 的 person 关联更改为包含 0 的 books_count,如 association :person, books_count: 0,那么我会得到错误 ActiveRecord::RecordInvalid: Validation failed: Books can't be blank,因为 ActiveRecord 认为新的 Person记录没有书籍。

我想让书厂打造一本书和一个人,让他们各自满足对方的要求。

我如何更改此代码以便 运行ning FactoryGirl.create(:book) 将创建所需的人员然后就此停止?

总结@Anthony 对问题的评论:

两个对象相互要求是不合逻辑的,因为一个必须先于另一个存在。因此,一个人可能需要书籍:

class Person < ActiveRecord::Base
  has_many :books, inverse_of: :person
  validates :books, presence: true
end

或者一本书需要一个人:

class Book < ActiveRecord::Base
  belongs_to :person
  validates :person, presence: true
end

但这两者并没有意义,因此不受 Active Record 的支持。