2015-03-06 17 views
5

Sto tentando di popolare il mio database SQLite3 con un semplice file seme che dovrebbe creare un gruppo di film nella tabella Film e quindi creare alcuni commenti a questo film che sono memorizzati nella tabella dei commenti.Impossibile chiamare create a meno che l'errore genitore non venga salvato durante il seeding nei binari

formats = %w(Beta VHS IMAX HD SuperHD 4K DVD BlueRay) 
30.times do 
    film = Film.create(title: "#{Company.bs}", 
       director: "#{Name.name}", 
       description: Lorem.paragraphs.join("<br/>").html_safe, 
       year: rand(1940..2015), 
       length: rand(20..240), 
       format: formats[rand(formats.length)] 
) 
    film.save 
    (rand(0..10)).times do 
    film.comments.create(author: "#{Name.name}", 
          title: "#{Company.bs}", 
          content: Lorem.sentences(3).join("<br/>").html_safe, 
          rating: rand(1..5) 
    ) 
    end 
end 

Una volta che eseguo rake db: seed ho inevitabilmente ottengo l'errore

ActiveRecord :: RecordNotSaved: Non è possibile chiamare creare meno che il genitore viene salvato

e vengono aggiunti nessun record a Film o Commenti

Il mio file film.rb è

class Film < ActiveRecord::Base 
    has_many :comments 

    validates_presence_of :title, :director 
    validates_length_of :format, maximum: 5, minimum:3 
    validates_numericality_of :year, :length, greater_than: 0 
    validates_uniqueness_of :title 
    paginates_per 4 
end 

Il limite di lunghezza su 'format' genera l'errore durante la creazione di un film con i formati selezionati dalla lista 'formato'

+1

È possibile aggiungere il file film.rb. Credo che a causa di un errore il film non venga salvato. Quindi quando cerchi di creare commenti per quel film, non viene creato. Abbiamo bisogno di trovare quale errore impedisce che il film venga creato per correggerlo prima. – coderhs

+3

o semplicemente cambiate 'Film.create' in' Film.create! 'E dovreste stabilire quale validazione impedisce il salvataggio del film. – basiam

+0

Sono d'accordo con @Coderhs. Abbiamo bisogno di vedere cosa Film appartiene a. C'è qualche logica nel tuo modello che ha bisogno del genitore del film per essere salvato in primo luogo. Una volta che sappiamo quale Film appartiene_per aggiungere prima i dati seme per il genitore, che dovrebbe creare i dati figlio a seconda che la logica sia corretta o meno. – James

risposta

20

ActiveRecord :: RecordNotSaved: Non è possibile chiamare creare meno che il genitore viene salvato

Ciò si verifica quando si tenta di salvare un'associazione figlio (Commento) ma il genitore (Film) non è ancora stato salvato.

Sembra che film non sia stato salvato. Guardando il codice, sembra che film = Film.create(...) stia fallendo le convalide e quindi film.comments.create(..) non può procedere. Senza sapere di più su quale validazione fallisce, questo è tutto ciò che posso dire.

Si consiglia di utilizzare create!(...) ovunque in seeds.rb. La versione bang farà sorgere un'eccezione se il record non è valido e aiuta a prevenire errori silenziosi.

+0

Grazie a te e @coderhs. Il mio errore è stato nascosto a te, ma il tuo consiglio mi ha aiutato a tenerne traccia e ad imparare un po 'di più. Il film.format è stato selezionato a caso da questo elenco di formati e limitato in film.rb tra 3 e 5. Tuttavia, l'elenco dei formati conteneva molti "formati" più lunghi 1. Uso di create! vedere gli errori è un ottimo consiglio 2. Anche ro.activerecord.errors.messages è un errore di i18n risolto installando correttamente quella gemma – Cristi