gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:41 25 4
gpt4 key购买 nike

我是 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 的人员关联更改为包含 0 的 books_count,如 association :person, books_count: 0,那么我会收到错误 ActiveRecord::RecordInvalid: Validation failed : Books 不能为空,因为ActiveRecord 认为新的Person 记录没有books。

我想让书厂创造一本书和一个人,并且让每个人都满足彼此的要求。

我如何更改此代码以便运行 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 的支持。

关于ruby-on-rails - FactoryGirl has_many 与双向存在验证的关联创建额外记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27928684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com