2012-08-23 18 views
0

Как вы можете построить завод, где один атрибут зависит от другого?Factory_girl: определение одного атрибута зависит от другого

factory :event do 
    sequence(:title) { |n| "Event #{n}" } 
    sequence(:description) { |n| "More detailed info about event #{n}" } 
    start_at { rand(1..100).days.from_now } 
    end_at { start_at + rand(1..5).hours } # <=== referencing start_at 
    end 

Используя это дает NameError: uninitialized constant Event мои функции, и я предполагаю, что это от попыток установить end_at до величины, зависящей от значения start_at. Как это сделать? Попытка создать несколько десятков действительных «событий». Благодарю.

+2

Используемый вами синтаксис является подходящим для определения [зависимых атрибутов] (https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md # зависимые-атрибуты). Из ошибки, которую я вижу, больше похоже на то, что она не может найти модель Event. Вы это определили? –

+1

Yup. ты прав. См. Комментарий ниже ... – Meltemi

ответ

0

Ошибка не возникает из-за чего-то неправильного внутри вашего заводского блока. Класс Event определен неправильно.

Не могли бы вы показать вашу модель событий?

Возможно, он вложен в модуль? Тогда вы могли бы сделать это:

factory :event, :class => 'ModuleName::Event' do 
    ... 
end 
+0

Я фактически назвал эту фабрику ': eventize', чтобы отличить ее от фабрики * static *. Требуется один с переменными атрибутами и одним w/out. Я полагаю, что это не нужно, но это то, что создавало ошибку. Не полностью понял внутреннюю работу Factory_girl. Итак, в то же время я только что добавил «parent: event» и заменил все атрибуты. похоже, работает ... но я, вероятно, собираюсь сделать Фабрики вообще неправильным способом!?! – Meltemi

0

Я думаю, что вы хотите сделать что-то вроде этого:

factory :event do 
    title 'foo' 
    description "bar" 
    other_attributes "baz" 

    factory :dynamic_event do 
    sequence(:title) { |n| "Event #{n}" } 
    end 

end 

:dynamic_event завод наследует все атрибуты от фабрики событий, но переопределяет, что те дали внутри его блок. (title в последовательности в этом примере)

+0

Имеет ли ': dynamic_' специальное значение в Factory_girl? Потому что, если нет, то я не думаю, что это сработает, потому что это в основном то, что у меня изначально было «factory: eventize do». – Meltemi

+0

no 'dynamic_' было просто именем в моей голове ;-) Возможно, я не получил то, что вы хотите сделать ... – Robin

+0

Ну, как я * просто * открыл, вы не можете иметь фабрику с имя, которое не соответствует модели, если вы не объявляете ее ': parent' другой фабрикой действительной модели. – Meltemi

Смежные вопросы