ruby-on-rails Rails Minitest:我可以通过`has_many`指定fixture关系吗?

bzzcjhmw  于 2023-06-07  发布在  Ruby
关注(0)|答案(1)|浏览(155)

我对https://API.rubyonrails.org/classes/ActiveRecord/FixtureSet.html#class-ActiveRecord::FixtureSet-label-Label+references+for+associations+-28belongs_to-2C +has_one-2C+has_many-29感到相当困惑,特别是他们的例子,其中似乎带有has_many :monkeys关系的Pirate模型正在has_many端定义一个fixture关联。
即,盗版reginald具有monkey: george

### in pirates.yml

reginald:
  name: Reginald the Pirate
  monkey: george

### in monkeys.yml

george:
  name: George the Monkey
  pirate: reginald

但是,当我尝试类似的东西(略有不同)时,我收到一个错误。

# test/fixtures/books.yml
book_one:
  title: lorem
  chapters: chapter_one, chapter_two

# test/fixtures/chapters.yml
chapter_one
  title: foo

chapter_two
  title: bar

# Error when running fixtures/testing
ActiveRecord::Fixture::FixtureError: table "books" has no columns named "chapters"

另一个例子让我更加困惑,这个例子显示了一个模型的fixture,has_many :fruits提供了一个水果列表来与fixture相关联。是的,文档在has_and_belongs_to_many关系下显示了这个示例,但我想它可能也适用于has_many关系。

### in monkeys.yml

george:
  id: 1
  name: George the Monkey
  fruits: apple, orange, grape

### in fruits.yml

apple:
  name: apple

orange:
  name: orange

grape:
  name: grape

所以我是不是该吃午饭了?这是不幸的,因为能够在has_many端指定fixture关联是很好的。

anauzrmj

anauzrmj1#

显然,夹具不能在父模型之前创建关联记录。我建议看看factory_bot肯定可以使用回调来创建相关记录:

FactoryBot.define do
  factory :monkey do
    name { "George the Monkey" }

    after(:create) do |monkey, evaluator|
      create_list(:fruit, 5, monkey: monkey)
      monkey.reload
    end
  end
end

相关问题