2016-01-13 4 views
0

У меня есть не слишком распространенная проблема с фабрикой. У меня есть несколько моделей, связанных друг с другом. Я создал довольно тонкую завод, который создает, что вся «цепочка», вызывая только нижеFactoryGirl - переопределить атрибут связанного с ним объекта

FactoryGirl.create(:application) 

Над команды создает, как я уже упоминал несколько связанных моделей. Я пользователь Faker для заполнения имен атрибутов. Все работает отлично, но я хотел бы переписать одну глубоко связанную модель под названием «сервис» с моделью приложения. Я думал о черте, но я не могу ссылаться на эту черту в

trait :my_trait do 
    name 'Overwritten name' 
end 

FactoryGirl.create(:application, :my_trait) 

Очевидно выше неправильно, потому что черта касаемо применение вместо вложенной модели обслуживания. Одно из найденных мной решений - это обновить его после создания фабрики, но я бы предпочел сделать это более глобально.

ответ

1

В этих случаях мы обычно создаем отдельный «нижний» экземпляр и передаем его в «верхний» экземпляр.

Как:

service = FactoryGirl.build(:service, name: 'Something else') 
application = FactoryGirl.create(:application, service: service) 

Конечно, вы также можете достичь того же поведение, если вы используете эту модель очень много в вашем коде со следующей фабрики:

factory :application do 
    transient do 
    service_name nil 
    end 

    association :service 

    after(:build) do |application, evaluator| 
    if evaluator.service_name 
     application.service.name = evaluator.service_name 
    end 
    end 
end 
+0

приложение не имеет службы, это связано с моделью седанов, как я уже упоминал. Вот только моя проблема. – mike927

+0

Тогда вам нужно будет создать «средний» экземпляр (ы), а также использовать второй пример. –

+0

callback and ignore statment это то, что я искал! Большое спасибо :) – mike927

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