FactoryGirl和after_create在模型中回调

时间:2013-07-12 17:09:17

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

我有两个模型BoardCategory,关系为has_many / belongs_to。

Board我有after_create回调为其创建默认类别。 因此,当我创建Board时,它会自动为其创建默认类别。

after_create do 
  categories.create(name: "All Links", description: nil)
end

现在我创建基本的:电路板工厂:

factory :board do
  name {Faker::Lorem.sentence(rand(5)+1)}
  description {Faker::Lorem.paragraph(rand(5))}
end

我有Board实例方法:root_category,返回此默认类别。

我的问题是,如何创建:基于此类别的工厂:board.root工厂和#root_category方法?类似的东西:

factory :category do
  1. board = FactoryGirl.create(:board)
  2. returns board.root_category as a factory output.
end

1 个答案:

答案 0 :(得分:1)

您的问题可以直接解决,但除了解决方案之外还有其他问题。

要准确回答您的问题,您不需要“类别”工厂来为电路板创建根类别。回调将在模型级执行,不需要干扰FactoryGirl。

更多关注点

  1. 在外部模型/类上使用回调不是好习惯。类别在Board之外,因此Board不应该在它的回调中调用Category,这应该是私有空间。相反,更好的方法是在BoardsController的#create

  2. 中将根类别添加到电路板中
  3. 您可能需要重新考虑您的建模。在常识中,模型及其类别在多对多关系中会更好。假设,在您的情况下,电路板具有类别“编码”,那么“编码”类别在您的建模中不能再用于其他电路板!