1

簡単な本のチェックアウトアプリケーションを構築しています。私がしなければならないことの 1 つは、本がチェックアウトされているかどうかを判断することです。book_check_out クラスを介して、人々と本のクラスのセットアップとの間の関連付けを行っています。私の目標は、 book の checked_out プロパティを使用して、本が現在チェックアウトされているかどうかを判断することです。ただし、本がチェックアウトされておらず、book.checked_out.XXX を参照している場合の現在の実装では、「予期していなかったときに nil オブジェクトがあります!」というエラーが表示されます。一部のビューの目的は、はい、その本がチェックアウトされていることを示し、他のビューでは、現在誰にチェックアウトされているかを示します。

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
4

2 に答える 2

1

ブール値の結果、つまり true または false のいずれかになるもの (たとえば、本がチェックアウトされているかどうかなど) がある場合、結果のデフォルトを想定する必要があります。この場合、false であると想定できます (本はデフォルトではチェックアウトされていません)。

book モデルで、has_many :checked_out行を削除し、同じ名前のメソッドを作成します。

def checked_out
  book_check_outs || false
end

これBookCheckOuts を返すか、インスタンスに関連付けられていない場合は FALSE を返します。アソシエーションをチェックし、厄介な nil オブジェクトエラーを取り除くための、迅速で簡単な、誰にでもできる方法を提供します。

編集また、TRUE または FALSE を返すだけで、book_check_outs が nil かどうかをチェックして最新のチェックアウトを返さないようにすることもできます。Rails は blank? というメソッドを提供しています。両方をnilと呼ぶのはどれですか? そして空?

def checked_out
  !book_check_outs.blank?
end

私はルビーが大好きです:)

于 2009-09-20T22:49:00.267 に答える
0

それが実際に重要かどうかは忘れましたが、わかりやすくするために、 has_many :through リレーションの上に has_many リレーションを配置することをお勧めします。

また、Book クラスで has_many :BookCheckOuts と has_one :checked_out を宣言する必要があるかどうかもわかりません。checked_outは実際には BookCheckOut であり、上記の多くを宣言したからです。

于 2009-09-20T22:50:01.827 に答える