Ruby on Rails evitar erro nulo quando se assume registro não pode existir
-
12-09-2019 - |
Pergunta
Estou construindo uma verificação simples livro fora do aplicativo. Uma das coisas que eu preciso fazer é determinar se um livro é verificado. Eu tenho minhas associações entre o meu povo eo livro configuração aulas através de uma classe book_check_out. Meu objetivo é usar a propriedade checked_out do livro para determinar se um livro está atualmente check-out. No entanto, em minha implementação presente quando um livro é não check-out e eu referência book.checked_out.XXX I receieve o erro " Você tem um objeto nulo quando você não esperava! " Meu objetivo é para uso book.checked_out para duas finalidades em alguns pontos de vista mostram que sim, que o livro está check-out e em outros pontos de vista mostram que ele está atualmente check-out para.
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
Solução
Quando você tem um resultado boolean, algo que pode ser verdadeira ou falsa (por exemplo, um livro pode ser verificado ou não), você precisa assumir um padrão para o resultado. Neste caso, podemos supor que é falso (o livro não é marcada por padrão).
No modelo de livro, remover seu has_many: checked_out linha e criar um método com o mesmo nome:
def checked_out
book_check_outs || false
end
Este deve retorno tanto os BookCheckOuts, ou se não houver nenhum associado à instância, FALSE. Dá-lhe uma rápida, fácil, infalível método de verificação de uma associação e remover o erro desagradável objeto nulo.
Editar Você também pode apenas retornar verdadeiro ou falso, e não devolver os checkouts mais recentes, verificando que book_check_outs é nulo ou não. Rails fornece um método chamado em branco? o que exige tanto nulo? e esvaziar?
def checked_out
!book_check_outs.blank?
end
Eu amo Ruby:)
Outras dicas
Eu esqueço se ele realmente importa ou não, mas por uma questão de clareza que você pode querer colocar a relação has_many acima do has_many:. Através de relação
Eu também não estou certo de que você deve declarar na classe livro que has_many: BookCheckOuts E ele has_one: checked_out, desde o checked_out realmente é um BookCheckOut que você declarou que ela tenha muitos dos acima.