【问题标题】:has_many relationship using FactoryGirl使用 FactoryGirl 的 has_many 关系
【发布时间】:2017-01-04 12:39:42
【问题描述】:

我正在尝试使用 FactoryGirl 工厂创建具有has_many 关系的实例但失败了。 我有两个课程:计算机和网卡。每台计算机可以有许多网卡。

定义了两个ActiveRecords:

1.

class Computer < ActiveRecord::Base
  has_many :network_cards
end

2.

class Article < ActiveRecord::Base
  belongs_to: computer
end

定义了以下工厂:

1.

factory :computer do
  sequence(:name) { |n| "PC_#{n}" }
  transient do
    network_cards_count 1
  end

  after(:create) do |computer|
    create_list(:network_card, evaluator.network_cards_count, computer: computer)
  done
end

2.

factory :network_card do
  sequence(:name) { |n| "NC_#{n}" }
  sequence(:type) { |n| "TYPE_#{n}" }
end

现在,在 RSpec 测试中创建计算机时,我遇到了一个我无法解释的奇怪行为。

@computer_1 = FactoryGirl.create(:computer)
@computer_1.network_cards.size #Expect 1. Got 0. Why?
@computer_1.reload
@computer_1.network_cards.size # Got 1

任何想法我错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord factory-bot


    【解决方案1】:

    试试这个:

     after(:build) do |computer, evaluator|
          computer.network_cards << build_list(:network_card, evaluator.network_cards_count, computer: computer)
     end
    

    【讨论】:

      【解决方案2】:
      factory :computer do
        sequence(:name) { |n| "PC_#{n}" }
        transient do
          network_cards_count 1
        end
      
        after(:create) do |computer, evaluator|
          create_list(:network_card, evaluator.network_cards_count, computer: computer)
          computer.reload #<----- solves the issue
        end
      end
      

      【讨论】:

      • evaluator 是否像 @Ahmed 的回答那样不在您的区块中?我一直指定它。
      • @Dan 这是一个错字。固定
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多