Question

Je construis un livre simple consulter l'application. L'une des choses que je dois faire est de déterminer si un livre est extrait. J'ai mes associations entre mon peuple et la configuration des cours de livre dans une classe book_check_out. Mon but est d'utiliser la propriété checked_out du livre pour déterminer si un livre est vérifié actuellement sur. Cependant, dans ma présente mise en œuvre quand un livre est pas vérifié et je référence book.checked_out.XXX Je receieve l'erreur « Vous avez un objet nul quand on ne s'y attendait pas! » Mon but est d'utiliser book.checked_out à deux fins dans certaines vues montrent que oui, ce livre est extrait et dans d'autres points de vue qui montrent qu'il est vérifié actuellement vers.

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
Était-ce utile?

La solution

Quand vous avez un résultat booléen, quelque chose qui peut être soit vrai ou faux (par exemple, un livre peut soit être vérifié ou non), vous devez assumer un défaut pour le résultat. Dans ce cas, on peut supposer qu'il est faux (le livre n'est pas vérifié par défaut).

Dans le modèle de livre, retirez votre has_many: checked_out ligne et créer une méthode avec le même nom:

def checked_out
  book_check_outs || false
end

devrait retour soit les BookCheckOuts, ou s'il n'y en a pas associé à l'instance, FAUX. Il vous donne une méthode rapide, facile, à toute épreuve de la vérification d'une association et la suppression de l'erreur d'objet nul méchant.

Modifier Vous pouvez aussi simplement retourner VRAI ou FAUX, et ne pas revenir les plus récentes checkouts en vérifiant que book_check_outs est nul ou non. Rails fournit une méthode appelée vide? qui appelle à la fois nulle? et vide?

def checked_out
  !book_check_outs.blank?
end

I love Ruby:)

Autres conseils

J'oublie si elle importe réellement ou non, mais pour des raisons de clarté, vous voudrez peut-être mettre la relation has_many au-dessus du has_many. Par rapport

Je suis pas sûr que vous devriez déclarerait dans la classe Livre qui il has_many: BookCheckOuts et il has_one: checked_out, depuis la checked_out en fait est un BookCheckOut qui vous l'a déclaré avoir beaucoup d'au-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top