У меня есть модель компании, которая принимает вложенные атрибуты для модели 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
Конечно, я не хочу менять все свои тесты таким образом, чтобы они работали. Как настроить мой завод для создания связанной модели во время создания модели компании?
Но мне нужно проверить, если компания получает какие-рекрутер атрибутов. Другими словами, я не хочу создавать компанию без рекрутера. Кроме того, приложение работает как ожидалось: если я добавлю рекрутера в форму компании, компания будет создана. Если я не выполнил проверку, не удалось. – wawka
@ wawka, я только что прочитал ваш вопрос и нашел, что ваше второе испытание еще не удалось, из доказательств, которые я видел. 'company.save' не выдаст никакой ошибки, поэтому вы можете подумать, что она прошла. Но если вы попробуете 'company.save!', Вы это увидите. Валидатор, которого вы попросили, невозможно на чистом уровне модели. Это можно сделать с помощью объекта формы или добавить в контроллер контролер для проверки параметров повторителя. Короче говоря, компания ** должна быть сохранена сначала **, тогда связанные рекрутеры могут быть созданы иначе ** company_id пуст ** и, таким образом, недействителен для сохранения. –
Также валидация не в хорошей логике. Когда модель A имеет множество моделей B, A является независимой, является бесплатной. Это создание не должно зависеть от B вообще. B зависит от A, конечно, без A вы не можете создать B. –