Frage

Ich baue eine einfache Buchanwendung überprüfen. Eines der Dinge, die ich tun muß, ist festzustellen, ob ein Buch ausgecheckt wird. Ich habe meine Assoziationen zwischen meinem Volk und Buch-Klassen-Setup durch eine book_check_out Klasse. Mein Ziel ist es, die CHECKED_OUT Eigenschaft Buch zu verwenden, um zu bestimmen, ob ein Buch gegenwärtig ausgecheckt wird. Doch in meiner gegenwärtigen Implementierung, wenn ein Buch nicht ausgecheckt und ich Referenz book.checked_out.XXX ich receieve den Fehler „ Sie haben ein Null-Objekt, wenn Sie es nicht erwartet haben! “ Mein Ziel ist für zwei Zwecke in einigen Ansichten verwenden book.checked_out zeigen, dass ja, wird das Buch ausgecheckt und in anderen Ansichten zeigen, die sie derzeit geprüft werden.

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
War es hilfreich?

Lösung

Wenn Sie ein boolean Ergebnis haben, etwas, das entweder wahr oder falsch sein kann (zum Beispiel ein Buch kann entweder ausgecheckt oder nicht), müssen Sie einen Standardwert für das Ergebnis zu übernehmen. In diesem Fall können wir es falsch annehmen (das Buch ist standardmäßig nicht ausgecheckt).

In dem Buch Modell, entfernen Sie Ihre has_many: CHECKED_OUT Linie und ein Verfahren mit dem gleichen Namen erstellen:

def checked_out
  book_check_outs || false
end

Das sollte Rückkehr entweder die BookCheckOuts, oder wenn es keine mit der Instanz zugeordnet, FALSCH. Es gibt Ihnen eine schnelle, einfache, narrensichere Methode zur Herstellung eines Verein überprüft und den fiesen Null-Objektfehler zu entfernen.

Bearbeiten Sie können auch zurückkehren nur wahr oder falsch, und nicht wieder die neuesten Kassen durch Prüfen, dass book_check_outs Null ist oder nicht. Rails bietet eine Methode namens leer? welche Anrufe sowohl nil? und leer?

def checked_out
  !book_check_outs.blank?
end

Ich liebe Rubin:)

Andere Tipps

ich vergessen, wenn es wirklich wichtig ist oder nicht, aber aus Gründen der Klarheit könnten Sie die has_many Beziehung über dem has_many setzen wollen. Durch Beziehung

Ich bin auch nicht sicher, dass Sie sollten in der Klasse Buch werden erklärt, dass es has_many: BookCheckOuts UND es has_one: CHECKED_OUT, da die CHECKED_OUT wirklich ist ein BookCheckOut, die Sie es viele von oben mit erklärt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top