Ruby on rails RubyonRails在假定记录可能不存在时防止出现零错误

Ruby on rails RubyonRails在假定记录可能不存在时防止出现零错误,ruby-on-rails,null,belongs-to,has-and-belongs-to-many,has-one,Ruby On Rails,Null,Belongs To,Has And Belongs To Many,Has One,我正在构建一个简单的图书签出应用程序。我需要做的一件事是确定一本书是否已签出。我通过一个book\u check\u out类在我的人员和book类之间建立了关联。我的目标是使用book的checked_out属性来确定当前是否签出了一本书。然而,在我目前的实现中,当一本书没有签出,我参考了book.checked_out.XXX,我收到了一个错误“当你没有预料到它时,你有一个nil对象!”我的目标是使用book.checked_out,在一些视图中有两个目的:是的,那本书已经签出,在其他视图中

我正在构建一个简单的图书签出应用程序。我需要做的一件事是确定一本书是否已签出。我通过一个book\u check\u out类在我的人员和book类之间建立了关联。我的目标是使用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-Person:book\u退房
结束

classbook:book\u退房
def已结帐
登记退房| | |假
结束
结束

class BookCheckOut
当您得到一个布尔结果时,可能是真的,也可能是假的(例如,一本书可以签出,也可以不签出),您需要为结果假设一个默认值。在这种情况下,我们可以假设它为false(默认情况下,该书未签出)

在书本模型中,删除has_many:checked_out行,并创建一个同名的方法:

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

编辑您也可以通过检查book\u check\u outs是否为零来返回TRUE或FALSE,而不返回最近的签出。Rails提供了一个名为blank的方法?这两个都是零?而且是空的

def checked_out
  !book_check_outs.blank?
end

我喜欢Ruby:)

当您得到一个布尔结果时,可能是真的,也可能是假的(例如,一本书可以签出,也可以不签出),您需要为结果假设一个默认值。在这种情况下,我们可以假设它为false(默认情况下,该书未签出)

在书本模型中,删除has_many:checked_out行,并创建一个同名的方法:

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

编辑您也可以通过检查book\u check\u outs是否为零来返回TRUE或FALSE,而不返回最近的签出。Rails提供了一个名为blank的方法?这两个都是零?而且是空的

def checked_out
  !book_check_outs.blank?
end

我喜欢Ruby:)

我忘了它是否真的重要,但为了清楚起见,你可能想把has\u many关系置于has\u many:through关系之上


我也不确定你是否应该在Book类中声明它有多个:BookCheckOut,它有一个:checked,因为checked实际上是一个BookCheckOut,你声明它有很多上面提到的内容。

我忘了它是否真的重要,但是为了清楚起见,你可能想把hasu-many关系置于hasu-many:through关系之上


我也不确定您是否应该在Book类中声明它有多个:BookCheckOut,它有一个:checked,因为checked实际上是一个BookCheckOut,您声明它有许多以上内容。

不幸的是,这返回了一个错误“uninitialized constant Book::BookCheckOut”。我喜欢这个想法,但我唯一担心的是,如果BookCheckOuts集合是最近签出的,并且如果它没有签出,那么我不会尝试访问它。返回false是完美的。我确实收到了“未初始化常量Book::BookCheckOuts”,直到我将两者都改为Book\u Checkouts。我认为它必须使用数据库命名约定。很抱歉,深夜响应以及所有这些,brain变得模糊不清,忘记了您需要访问生成的访问器而不是类。不幸的是,这返回了一个错误“uninitialized constant Book::BookCheckout”。我喜欢这个想法,但我唯一担心的是,如果BookCheckOuts集合是最近签出的,并且如果它没有签出,那么我不会尝试访问它。返回false是完美的。我确实收到了“未初始化常量Book::BookCheckOuts”,直到我将两者都改为Book\u Checkouts。我认为它必须遵循数据库命名惯例。很抱歉,深夜的响应和所有这些,brain变得模糊不清,忘记了您需要访问生成的访问器,而不是类。我同意有很多,也有一个,这感觉有点尴尬。我正在寻找“正确”的方式来处理这件事。我已经换了很多很多了。我也不确定这是否重要,但我同意你的建议让事情变得更清楚。好吧,我想我的问题是:你的图书馆里有同一本书的多个副本,因此可以借出不同的吗?如果不是这样的话,你只需要一个“有一个”的关系。如果你有多个副本,那么你可能想要一个像PhysicalBook这样的模型,它代表了你拥有的每一本物理书……我同意,这本书有很多,也有一本,感觉有点尴尬。我正在寻找“正确”的方式来处理这件事。我已经换了很多很多了。我也不确定这是否重要,但我同意你的建议让事情变得更清楚。好吧,我想我的问题是:你的图书馆里有同一本书的多个副本,因此可以借出不同的吗?如果不是这样的话,你只需要一个“有一个”的关系。如果您确实有多个副本,那么您可能需要一个类似于PhysicalBook的模型,它是您要创建的每个物理书籍的表示形式