1

我正在構建一個簡單的書籍檢出應用程序。我需要做的一件事就是確定一本書是否被簽出。我通過book_check_out類設置了我的人員和書籍班級之間的關聯。我的目標是使用book的checked_out屬性來確定一本書目前是否已簽出。但是,在我目前的實現中,當一本書沒有被檢出並且我參考book.checked_out.XXX時,我接收到錯誤「」當你沒有想到它時,你有一個零對象!「我的目標是使用book.checked_out出於兩個目的,在一些觀點中表明是的,那本書被檢出,並在其他視圖中顯示目前檢出的人。Ruby on Rails在假定記錄可能不存在時防止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 

回答

1

當你已經有了一個布爾結果,這東西可以是真的還是假的(例如,一本書可以被檢查出來與否) ,您需要爲結果假設默認值。在這種情況下,我們可以認爲它是錯誤的(本書沒有默認檢出)。

在這本書中的模型,免除您的的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 

我愛紅寶石:)

+0

這不幸的是,返回一個錯誤「未初始化常量Book :: BookCheckOuts」。我喜歡這個主意,但我唯一擔心的是,如果checked_out只是最近一次檢出,並且沒有檢出返回false,那麼我不會試圖訪問BookCheckOuts集合。 – ahsteele 2009-09-20 22:59:25

+0

我確實收到「未初始化的常量Book :: BookCheckOuts」,直到我將它們都更改爲book_check_outs。我認爲它必須做w /數據庫命名約定。 – ahsteele 2009-09-21 01:39:47

+0

對不起,深夜響應和所有這些,大腦變得模糊,忘記了你需要訪問生成的訪問者而不是類。 – 2009-09-21 06:30:00

0

我忘了,如果它實際上重要與否,而是爲了清晰起見你可能想要把上面的has_many的關係的has_many:通過關係。

我也不清楚,你應該在書類中聲明,它的has_many:BookCheckOuts和IT HAS_ONE:checked_out,因爲checked_out 實際上是你宣佈有上述許多它BookCheckOut。

+0

我同意w/has_many和has_one它感覺有點尷尬。我正在尋找解決這個問題的「正確」方法。我已經切換了has_many和has_many。我也不確定它是否重要,但我同意你的建議使事情更清楚。 – ahsteele 2009-09-20 23:01:27

+0

嗯,我猜我的問題是:你的圖書館裏是否有同一本書的多個副本,因此可以借出不同的書?如果_not_那麼你只需要一個has_one關係。如果你有多個副本,那麼你可能想要有一個類似於你所擁有的每本實體書的代表的一本PhysicalBook模型... – 2009-09-21 12:43:22