oluşturmak gerektiren bir doğrulama ile bir has_many ile ilişkili listeleri oluşturmak için fabrika kızı, verilen üç modelin Kullanıcı, aşağıdaki ilişkileri ve doğrulamaları ile Madde ve Yorumcu için:nasıl kullanıcı bu bir Raylar uygulamasında
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
ve daha yeni DSL kullanarak aşağıdaki fabrikaları: doğrulama başarısız çünkü çalışmıyor makale oluşturmak için fabrika
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
yorumcular oluşturulmadan önce:
> FactoryGirl.create(:article)
ActiveRecord::RecordInvalid: Validation failed: article must have at least one reviewer.
Bu engelin üstesinden gelmeye çalıştığımı itiraf etmek istediğimden daha fazla girişimde bulundum, ama sıkıştım! Ben Bir fikir böyle yorumcular yaratmaktı:
factory :article do
body "This is the article content"
title "This is the title"
user
reviewers {|a| [FactoryGirl.create(:reviewer, article: a)] }
end
ancak bu bağlamda
"a" örneği değildir. Yani bu da işe yaramıyor.
, alıyorum: SystemStackError: yığın seviyesi çok derin. Gözden geçirme fabrikası kovulduğu zaman, makale hakkında bir şey bilmiyor gibi görünüyor, bu yüzden başka bir makale oluşturmaya çalışıyor. – Blizzo
@Blizzo Makale oluşturma işlemini gözden geçiren fabrikadan kaldırabilir veya before_create kullanabilirsiniz. Cevabımı yansıtacak şekilde düzenledim. – Unixmonkey
İkinci örneğinizi ekledikten sonra ekledim ve doğrulama hatasını aldım: ActiveRecord :: RecordInvalid: Validation başarısız oldu: makale en az bir gözden geçiriciye sahip olmalıdır – Blizzo