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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top