Pregunta

Estoy construyendo un simple libro echa un vistazo a la aplicación. Una de las cosas que tengo que hacer es determinar si un libro está desprotegido. Tengo mis asociaciones entre mi pueblo y la configuración de las clases de libros a través de una clase book_check_out. Mi objetivo es utilizar la propiedad checked_out del libro para determinar si un libro está marcada actualmente a cabo. Sin embargo, en mi aplicación presente cuando un libro no está desprotegido y referencia book.checked_out.XXX I receieve el error " tiene un objeto nulo cuando no lo esperas! " Mi objetivo es book.checked_out utilizar para dos propósitos en algunos puntos de vista demuestran que sí, que el libro está desprotegido y en otros puntos de vista muestran que se comprueba actualmente a.

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
¿Fue útil?

Solución

Cuando se tiene un resultado booleano, algo que puede o bien ser verdadera o falsa (por ejemplo, un libro o bien puede ser prestados o no), es necesario asumir un valor predeterminado para el resultado. En este caso, podemos asumir que es falsa (el libro no está marcada por defecto).

En el modelo de libro, quitar su has_many: checked_out línea y crear un método con el mismo nombre:

def checked_out
  book_check_outs || false
end

Este debe devuelven los BookCheckOuts, o si no hay ninguno asociado con la instancia, FALSO. Se le da un método rápido, fácil, a toda prueba de comprobación de una asociación y eliminar el error de objeto nulo desagradable.

Editar También puedes, simplemente devolver VERDADERO o FALSO, y no regresar las cajas más recientes comprobando que book_check_outs es nula o no. Rieles proporciona un método llamado en blanco? que exige tanto nula? y vacío?

def checked_out
  !book_check_outs.blank?
end

Me encanta Ruby:)

Otros consejos

Me olvido de si realmente importa o no, pero por el bien de la claridad es posible que desee para poner la relación has_many por encima de la has_many:. Través de la relación

Además, no estoy seguro de que debería estar declarando en la clase de libro que has_many: BookCheckOuts y se has_one: checked_out, ya que el checked_out realmente es un BookCheckOut los que haya declarado que tiene muchas de arriba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top