FactoryBot拒绝与协会建立工厂

时间:2018-02-22 11:16:45

标签: ruby-on-rails rspec associations factory-bot

无法找到FactoryBot拒绝使用has_and_belongs_to_many关系建立与相同模型关联的工厂的原因。

产品型号:

class Product < ApplicationRecord
#...
  has_and_belongs_to_many :refs,
    class_name: "Product",
     join_table: :refs,
    foreign_key: :from_id,
    association_foreign_key: :to_id,
    dependent: :destroy
  after_destroy :destroy_inverse_refs
#...
end

参考模型:

class Ref < ActiveRecord::Base
#...
  belongs_to :from, class_name: 'Product', foreign_key: 'from_id'
  has_one :to, class_name: 'Product', foreign_key: 'id', primary_key: 'to_id'
end

厂:

FactoryBot.define do
  factory :ref do
    association :from, factory: :product
    association :to, factory: :product
  end
end

无法找到此工厂构建的原因:从与id的关联和:到没有它的关联:

ref = FactoryBot.build(:ref)

puts ref.inspect
#<Ref id: nil, from_id: 8965, to_id: nil, created_at: nil, updated_at: nil>

puts ref.from.inspect
#<Product id: 8965, category_id: 12167, name_en: "Product name 1">

puts ref.to.inspect
#<Product id: nil, category_id: 12168, name_en: "Product name 2">

1 个答案:

答案 0 :(得分:0)

仔细阅读https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#associations后,我只有一个想法。

想象一下

P1 --from-> REF --to-> P2

REF belongs_to P1,因此假定REF.from_id是必需的。因此,最有可能FactoryBot玩得安全,并且猜测创建from对象并将其保存在数据库中会更好,这就是为什么ID已存在的原因。

另一方面has_one :to可以安全地推迟DB中的P2创建,直到保存ref。

也许在您的情况下FactoryBot的猜测不正确,您可能希望使用strategy:选项进行关联。

如果您希望这两个ID都可用,请尝试strategy: :create,但不确定它是否会build(:ref)呈现create(:ref)

的行为