1

我正在构建一个简单的图书签出应用程序。我需要做的一件事是确定一本书是否已签出。我通过 book_check_out 类设置了我的人员和书籍类之间的关联。我的目标是使用 book 的 checked_out 属性来确定当前是否已签出一本书。然而,在我目前的实现中,当一本书没有被签出并且我参考 book.checked_out.XXX 我收到错误“你没想到它有一个 nil 对象! ”我的目标是使用 book.checked_out 两个在某些视图中,目的表明是的,该书已被签出,而在其他视图中,则显示当前已签出给谁。

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

当你有一个布尔结果,可以是真或假的东西(例如,一本书可以被检出或不被检出),你需要假设结果的默认值。在这种情况下,我们可以假设它是错误的(默认情况下不会签出该书)。

在 book 模型中,删除您的has_many :checked_out行并创建一个具有相同名称的方法:

def checked_out
  book_check_outs || false
end

应该返回 BookCheckOuts,或者如果没有与实例关联,则返回 FALSE。它为您提供了一种快速、简单、万无一失的方法来检查关联并消除讨厌的 nil 对象错误。

编辑您也可以只返回 TRUE 或 FALSE,而不通过检查 book_check_outs 是否为 nil 来返回最近的结帐。Rails 提供了一个叫空白的方法?哪个都叫零?和空的?

def checked_out
  !book_check_outs.blank?
end

我爱红宝石:)

于 2009-09-20T22:49:00.267 回答
0

我忘记了它是否真的重要,但为了清楚起见,您可能希望将 has_many 关系放在 has_many :through 关系之上。

我也不确定您是否应该在 Book 类中声明它 has_many :BookCheckOuts 并且它 has_one :checked_out,因为check_out实际上是一个 BookCheckOut,您声明它具有上述许多内容。

于 2009-09-20T22:50:01.827 回答