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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top