2012-05-02 20 views
18

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.

cevap

3
factory :article do 
    reviewers {|a| [a.association(:reviewer)] } 
end 

ya da ben bir sorun olarak Fabrika Kız github sayfasında bu aşkın yeniden yayınladı ve cevap yolumu çalıştı

factory :article do 
    before_create do |a| 
    FactoryGirl.create(:reviewer, article: a) 
    end 
end 
+0

, 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

+0

@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

+0

İ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

22

: Anahtar bunu yapıyordu

before_create do |article| 
    article.reviewers << FactoryGirl.build(:reviewer, article: article) 
end 

before_create, bu yüzden doğrulamalar henüz tetiklenmedi ve yeni oluşturulan gözden geçiriciyi oluşturulan örnekte gözden geçirme listesine zorladığınızdan emin olun. yanıt ve tutmak için Unixmonkey sayesinde beni yeni şeyler denemekten :)

https://github.com/thoughtbot/factory_girl/issues/369#issuecomment-5490908

+0

Benzer bir sorun yaşıyordum ve bunu çözdüm. Teşekkürler! – ryanpitts1

1

yeni sözdizimi: Bunu çalıştığınızda

before(:create) do |article| 
    article.reviewers << FactoryGirl.build(:reviewer, article: article) 
end 
İlgili konular