ruby-on-rails – FactoryGirl has_many与双向在线验证的关联创
我是FactoryGirl的新手,我遇到了这个特定用例的问题,这个用例似乎没有在文档中介绍过.
我有两个模型,人物和书.一个人有很多书,一本书属于一个人,并且都有一个需要彼此存在的验证. (一本书必须有一个人,一个人必须至少有一本书.) 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,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)时,会发生以下情况: >创建书籍记录 如果我更改Book工厂的人员关联以包含books_count为0,如关联:person,books_count:0,那么我得到错误ActiveRecord :: RecordInvalid:验证失败:书籍不能为空,因为ActiveRecord认为新的人事记录没有书籍. 我希望图书工厂创作一本书和一个人,并让每个人都满足彼此的要求. 如何更改此代码以便运行FactoryGirl.create(:book)将创建所需的人员然后停在那里? 解决方法
总结@ Anthony对这个问题的评论:
两个对象相互要求是不合逻辑的,因为在另一个对象存在之前必须存在.因此,一个人可能需要书籍: class Person < ActiveRecord::Base has_many :books,presence: true end 或者是一本要求一个人的书: class Book < ActiveRecord::Base belongs_to :person validates :person,presence: true end 但两者在一起没有意义,因此不受Active Record的支持. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |