Ruby on Rails prevenire l'errore pari a zero quando si presume record non può esistere
-
12-09-2019 - |
Domanda
Io sono la costruzione di un libro semplice check-out applicazione. Una delle cose che ho bisogno di fare è determinare se un libro è verificato. Ho le mie associazioni tra il mio popolo e il libro di installazione classi attraverso una classe book_check_out. Il mio obiettivo è quello di utilizzare la proprietà checked_out del libro per determinare se un libro è attualmente estratto. Tuttavia, nella mia presente applicazione quando un libro non è controllato e mi riferimento book.checked_out.XXX ho receieve l'errore " si ha un oggetto nullo quando non hai lo aspetti! " Il mio obiettivo è utilizzare book.checked_out per due scopi in alcuni punti di vista mostrano che sì, quel libro è stato estratto e in altre visualizzazioni mostrano che esso è attualmente estratto da.
class Person < ActiveRecord::Base
has_many :book_check_outs
has_many :books, :through => :book_check_outs
end
class Book < ActiveRecord::Base
has_many :book_check_outs
has_many :people, :through => :book_check_outs
def checked_out
book_check_outs || false
end
end
class BookCheckOut < ActiveRecord::Base
belongs_to :book
belongs_to :person
end
Soluzione
Quando hai un risultato booleano, qualcosa che può essere sia vera o falsa (per esempio, un libro può essere controllato sia o no), è necessario assumere un valore predefinito per il risultato. In questo caso, si può supporre che sia falsa (il libro non è estratto per impostazione predefinita).
Nel modello libro, rimuovere il has_many: checked_out di linea e creare un metodo con lo stesso nome:
def checked_out
book_check_outs || false
end
Questo dovrebbe di ritorno sia le BookCheckOuts, o se non ce ne sono associati con l'istanza, FALSE. Ti dà un veloce, facile, metodo, infallibile di controllo un'associazione e rimuovendo l'errore oggetto nullo brutto.
Modifica Si potrebbe anche solo restituire true o false, e non tornare alle casse più recenti verificando che book_check_outs è pari a zero o meno. Rails fornisce un metodo chiamato vuoto? che prevede sia pari a zero? e vuota?
def checked_out
!book_check_outs.blank?
end
Amo Rubino:)
Altri suggerimenti
Non ricordo se effettivamente conta o no, ma per amor di chiarezza si potrebbe desiderare di mettere il relazione has_many sopra il has_many:. Tramite relazione
Non sono anche sicuro si dovrebbe essere dichiarando nella classe Libro che has_many: BookCheckOuts Ed has_one: checked_out, in quanto la checked_out effettivamente è una BookCheckOut che ha dichiarato avendo molti di sopra.