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)
时,会发生以下情况:
- 已创建图书记录
- 已创建人员记录
- 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 的支持。
我是 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)
时,会发生以下情况:
- 已创建图书记录
- 已创建人员记录
- 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 的支持。