In un'applicazione Rails, somministrati tre modelli d'uso, l'articolo e revisore con le seguenti relazioni e le convalide:Come ragazza all'utente fabbrica per creare elenchi associati con un has_many con una convalida che lo richiede il creare
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
e le seguenti fabbriche che utilizzano il DSL più recente:
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
la fabbrica per creare l'articolo non funziona perché la convalida non riesce prima di creare i revisori:
> FactoryGirl.create(:article)
ActiveRecord::RecordInvalid: Validation failed: article must have at least one reviewer.
Ho fatto più tentativi di quanto vorrei ammettere cercando di superare questo ostacolo, ma sono bloccato! Un'idea che avevo era quella di creare i revisori come questo:
factory :article do
body "This is the article content"
title "This is the title"
user
reviewers {|a| [FactoryGirl.create(:reviewer, article: a)] }
end
ma in questo contesto, la "a" non è l'istanza. Quindi non funziona neanche, come prima.
Quando provo questo, ottengo: SystemStackError: livello di strato troppo in profondità. Sembra che quando la fabbrica di revisori viene licenziata, non sappia dell'articolo, quindi prova a creare un altro articolo. – Blizzo
@ Blora È possibile rimuovere la creazione dell'articolo dalla fabbrica del revisore o utilizzare before_create. Ho modificato la mia risposta per riflettere questo. – Unixmonkey
Ho dato un secondo colpo anche al secondo esempio dopo averlo aggiunto e ottenuto l'errore di convalida: ActiveRecord :: RecordInvalid: convalida non riuscita: l'articolo deve avere di nuovo almeno un revisore – Blizzo