如何在FactoryGirl中创建一个关联,并使用另一个FactoryGirl关联延迟评估的值

时间:2013-12-19 15:20:03

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

是否可以使用关联作为特征中另一个关联的值?

让我描述一个(简化的)例子。我有3个型号

  • User
  • Forumbelongs_to :forum
  • Threadbelongs_to :forumbelongs_to :user

请注意,Thread包含user_id,它不属于UserForum(目前,我无法更改此约束)。

我想知道的是,是否有办法定义像

这样的特征
FactoryGirl.define do
  factory :thread do
    trait :with_forum do
      association :user
      # Lazy-evaluate the value of user to the previously created factory
      # THIS IS THE KEY POINT: I want 'user' to be the factory created at the previous line
      association :forum, user: user
    end
  end
end

该特征应该做的是创建一个用户并将其与该线程相关联。 然后它应该创建一个论坛,但用户应该是先前创建的同一个实例。

主要有两个原因:

  • 与论坛关联的用户与主题
  • 相同
  • 我不想在级联
  • 上创建两个用户工厂

有什么想法吗?我尝试使用延迟评估,但无法将其与关联一起使用。

2 个答案:

答案 0 :(得分:2)

执行相反操作并将线程的用户设置为与论坛相同是否有意义?论坛工厂是否创建了用户?

FactoryGirl.define do
  factory :thread do
    trait :with_forum do
      forum
      user { forum.user }
    end
  end
end

如果你真的想以另一种方式去做,你绝对可以使用懒惰属性:

FactoryGirl.define do
  factory :thread do
    trait :with_forum do
      user
      forum { create(:forum, user: user) }
    end
  end
end

不利于用于构建线程的策略,它将始终创建一个论坛。

答案 1 :(得分:1)

你必须懒惰地评估association电话:

FactoryGirl.define do
  factory :thread do
    trait :with_forum do
      user
      forum { association(:forum, user: user) }
    end
  end
end