Ruby on Rails的防止当假设记录可能不存在零差错
-
12-09-2019 - |
题
我建立一个简单的书退房申请。其中之一,我需要做的事情是确定一本书被检查出来。我有我的人,书类设置之间的关联通过book_check_out类。我的目标是用书的checked_out属性来确定一本书目前已签出。然而,在目前的执行情况时,一本书未签出,我引用book.checked_out.XXX我receieve错误“的你有一个零对象时,你没想到吧!的”我的目标是使用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
解决方案
当你已经有了一个布尔结果,这东西可以是真的还是假的(例如,一本书可以被检查出来与否),您需要承担结果的默认值。在这种情况下,我们可以认为它是假的(这本书是不是默认选中了)。
在这本书的模型,免除您的的has_many:checked_out 的行,创建具有相同名称的方法:
def checked_out
book_check_outs || false
end
此应返回任一BookCheckOuts,或者如果没有,则与该实例相关联,FALSE。它给你一个快速,简单,万无一失检查关联并除去讨厌的零对象错误的方法。
修改您也只是返回TRUE或FALSE,而不是通过检查book_check_outs为零或不返回最近的检出。 Rails提供了一个名为空白方法?这就要求未缴?和空?
def checked_out
!book_check_outs.blank?
end
我爱红宝石:)
其他提示
我忘了,如果它实际上重要与否,而是为了清晰起见你可能想要把上面的has_many的关系的has_many:通过关系
我也不清楚,你应该在书类中声明,它的has_many:BookCheckOuts和IT HAS_ONE:checked_out,因为checked_out的真正的是,你宣布有上述许多它BookCheckOut。
不隶属于 StackOverflow