我建立一个简单的书退房申请。其中之一,我需要做的事情是确定一本书被检查出来。我有我的人,书类设置之间的关联通过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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top