我一直在閱讀的Rails 3路,並檢查CollectionAssociation.include?
CollectionAssociation.include?檢查數據庫中是否存在記錄?
書中的行爲按說明:
檢查,看是否該協會 集合中存在提供的記錄,它仍然存在於底層數據庫 表中。
我做了幾個測試來檢查數據庫是否被檢查,但看起來像它沒有檢查。
> book = Book.first
=> #<Book id: 1, title: "Programming Ruby"...
> last_chapter = book.chapters.last
=> #<Chapter id: 2, title: "Chapter 2", book_id: 1,
> b.chapters.include?(last_chapter)
=> true
> last_chapter.destroy
DELETE FROM "chapters" WHERE "chapters"."id" = ? [["id", 2]]
=> #<Chapter id: 2, title: "Chapter 2", book_id: 1,
> b.chapters.include?(last_chapter)
=> true
> book.chapters.reload
=> [#<Chapter id: 1, title: "Chapter 1", book_id: 1,...]
> b.chapters.include?(last_chapter)
=> false
我檢查了源代碼,發現一行load_target if options[:finder_sql]
似乎有條件地加載記錄。
當數據庫將被訪問以檢查數據庫中是否存在記錄時,您是否有任何想法?
謝謝你的深刻解答。這對理解很多事情確實有幫助。 –
但問題仍然存在,在'include?'方法碰到數據庫的情況下? –
當且僅當'章節'尚未被加載時,include?'(或任何其他作用於數組的方法)纔會觸發DB。除非由於延遲加載而第一次調用它,否則「章節」不會被加載。當我說「當你第一次打電話給我的時候」,我的意思是叫'book.chapters',這是一種「獲取」章節的方法。 – ronalchn