2013-08-31 4 views
0

У меня есть модель компании, которая принимает вложенные атрибуты для модели Recruiters. Мне нужно иметь подтверждение в моей модели компании, что во время создания компании был создан хотя бы один рекрутер.Ошибка проверки Factory Girl и вложенных атрибутов

class Company < ActiveRecord::Base 
    has_many :recruiters, dependent: :destroy, inverse_of: :company 
    accepts_nested_attributes_for :recruiters, reject_if: ->(attributes) { attributes[:name].blank? || attributes[:email].blank? }, allow_destroy: true 

    validate { check_recruiters_number } # this validates recruiters number 

    private 

    def recruiters_count_valid? 
     recruiters.reject(&:marked_for_destruction?).count >= RECRUITERS_COUNT_MIN 
    end 

    def check_recruiters_number 
     unless recruiters_count_valid? 
      errors.add(:base, :recruiters_too_short, count: RECRUITERS_COUNT_MIN) 
     end 
    end 
end 

Валидация работает должным образом, но после добавления этой проверки у меня возникла проблема с FactoryGirl. Моя фабрика для компании выглядит следующим образом:

FactoryGirl.define do 
    factory :company do 
     association :industry 
     association :user 
     available_disclosures 15 
     city 'Berlin' 
     country 'Germany' 

     ignore do 
      recruiters_count 2 
     end 

     after(:build) do |company, evaluator| 
      FactoryGirl.create_list(:recruiter, evaluator.recruiters_count, company: company) 
     end 

     before(:create) do |company, evaluator| 
      FactoryGirl.create_list(:recruiter, evaluator.recruiters_count, company: company) 
     end 
    end 
end 

В тестах, когда я

company = create(:company) 

Я получаю ошибку проверки:

ActiveRecord::RecordInvalid: 
    Validation failed: Company has to have at least one recruiter 

Когда я первый построить компанию, а затем сохранить его, проходит испытания:

company = build(:company) 
company = save 

Конечно, я не хочу менять все свои тесты таким образом, чтобы они работали. Как настроить мой завод для создания связанной модели во время создания модели компании?

ответ

1

Ваш validate { check_recruiters_number } необоснован. Убери это.

Почему? У вас должен быть действительный идентификатор компании, чтобы сохранить рекрутеров, но ваш валидатор не позволяет компании быть действительной, поскольку у нее нет рекрутеров. Это противоречит.

+0

Но мне нужно проверить, если компания получает какие-рекрутер атрибутов. Другими словами, я не хочу создавать компанию без рекрутера. Кроме того, приложение работает как ожидалось: если я добавлю рекрутера в форму компании, компания будет создана. Если я не выполнил проверку, не удалось. – wawka

+0

@ wawka, я только что прочитал ваш вопрос и нашел, что ваше второе испытание еще не удалось, из доказательств, которые я видел. 'company.save' не выдаст никакой ошибки, поэтому вы можете подумать, что она прошла. Но если вы попробуете 'company.save!', Вы это увидите. Валидатор, которого вы попросили, невозможно на чистом уровне модели. Это можно сделать с помощью объекта формы или добавить в контроллер контролер для проверки параметров повторителя. Короче говоря, компания ** должна быть сохранена сначала **, тогда связанные рекрутеры могут быть созданы иначе ** company_id пуст ** и, таким образом, недействителен для сохранения. –

+0

Также валидация не в хорошей логике. Когда модель A имеет множество моделей B, A является независимой, является бесплатной. Это создание не должно зависеть от B вообще. B зависит от A, конечно, без A вы не можете создать B. –

0

Это старый вопрос, но у меня аналогичная проблема, и я решил его с помощью следующего кода (переписано, чтобы соответствовать вашему делу):

FactoryGirl.define do 
    factory :company do 
     association :industry 
     association :user 
     available_disclosures 15 
     city 'Berlin' 
     country 'Germany' 

     ignore do 
      recruiters_count 2 
     end 

     after(:build) do |company, evaluator| 
      company.recruiters = FactoryGirl.build_list(:recruiter, evaluator.recruiters_count, company: company) 
     end 
    end 
end 
Смежные вопросы