2013-12-19 3 views
4

Возможно ли использовать ассоциацию как значение для другой ассоциации в признаке?Как создать ассоциацию в FactoryGirl со значением lazy-оценено от другой ассоциации FactoryGirl

Позвольте мне описать (упрощенный) пример. У меня есть 3 модели

  • User
  • Forum (belongs_to :forum)
  • Thread (belongs_to :forum, belongs_to :user)

Пожалуйста, обратите внимание, что Thread содержит user_id, он не принадлежит к User через Forum (в настоящее время я не могу изменить такое ограничение).

То, что я хотел бы знать, является, если есть способ, чтобы определить черту, как один

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

Имеет ли смысл делать обратное и устанавливать, чтобы пользователь потока был таким же, как и форум? Создает ли форум фабрику пользователя?

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 

Недостатком будет, что он всегда будет создать форум, независимо от используемой стратегии для создания потока.

0

Вы должны лениво оценить association вызов:

FactoryGirl.define do 
    factory :thread do 
    trait :with_forum do 
     user 
     forum { association(:forum, user: user) } 
    end 
    end 
end 
Смежные вопросы