加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – FactoryGirl has_many与双向在线验证的关联创

发布时间:2020-12-17 02:07:38 所属栏目:百科 来源:网络整理
导读:我是FactoryGirl的新手,我遇到了这个特定用例的问题,这个用例似乎没有在文档中介绍过. 我有两个模型,人物和书.一个人有很多书,一本书属于一个人,并且都有一个需要彼此存在的验证. (一本书必须有一个人,一个人必须至少有一本书.) class Person ActiveRecord::
我是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)时,会发生以下情况:

>创建书籍记录
>创建人员记录
> Person工厂创建了第二个不需要的书籍记录.

如果我更改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的支持.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读