В приложении Rails, учитывая три модели пользователя, статьи и рецензент со следующими отношениями и валидациями:Как пользователь завод девушка создавать связанные списки с has_many с проверкой, которая требует его на создание
class User < ActiveRecord::Base
has_many :articles
has_many :reviewers
end
class Reviewer < ActiveRecord::Base
belongs_to :user
belongs_to :article
end
class Article < ActiveRecord::Base
belongs_to :user
has_many :reviewers
validate :has_reviewers?
def has_reviewers?
errors.add(:base, "article must have at least one reviewer.") if self.reviewers.blank?
end
end
И следующие заводы, использующие новый DSL:
FactoryGirl.define do
factory :user do
name { (8...20).map{ ('a'..'z').to_a[rand(26)] }.join }
age { Kernel.rand(100) }
end
factory :article do
body "This is the article content"
title "This is the title"
user
after_create do |article|
article.reviewers = create_list(:user, 2)
end
end
factory :reviewer do
user
article
state { ["published","draft","rejected","archived"][Kernel.rand(4)] }
end
end
завод, чтобы создать статью, не работает, потому что проверка не пройдена до создания рецензентов:
> FactoryGirl.create(:article)
ActiveRecord::RecordInvalid: Validation failed: article must have at least one reviewer.
Я сделал больше попыток, чем хотел бы признать попытку преодолеть это препятствие, но я застрял! Одна из идей, у меня были создать рецензент так:
factory :article do
body "This is the article content"
title "This is the title"
user
reviewers {|a| [FactoryGirl.create(:reviewer, article: a)] }
end
, но в этом контексте, «а» не экземпляр. Так что это тоже не работает, как раньше.
Когда я пытаюсь это, я получаю: SystemStackError: уровень стека слишком глубоко. Похоже, что когда фабрика рецензентов уволили, она не знает об этой статье, поэтому пытается создать еще одну статью. – Blizzo
@Blizzo Вы можете удалить создание статьи с фабрики рецензента или использовать before_create. Я отредактировал свой ответ, чтобы отразить это. – Unixmonkey
Я также добавил ваш второй пример, после того как вы добавили его и получили ошибку проверки: ActiveRecord :: RecordInvalid: не удалось выполнить проверку: у статьи должен быть хотя бы один рецензент. – Blizzo