3

想象一个像这样的简单案例:

class Book
  has_many :chapters
end

假设在我的控制器中我做了这样的事情:

book = Book.find(:first, 
                 :include => :chapters, 
                 :conditions => ['chapters.title = ?', "In the beginning"]

现在假设我要显示章节。如何在不再次访问数据库的情况下解决 Rails 中的章节?如果我做这样的事情:

chapters = book.chapters.select{|chapter| chapter.title == "In the beginning"}

Rails 是否会重新访问所有章节的数据库,以便扫描它们,然后更糟糕的是,必须在控制器代码中再次扫描它们?

看起来像这样使用 find 的东西:

chapters = Chapter.find_by_book_id_and_title(book.id, "In the beginning")

即使章节已经被缓存,也会导致数据库再次被命中。

4

1 回答 1

3

根据AR Association API,使用 :include => :chapters 应该将其全部取回,从而导致总共 2 个查询。从那里您应该能够在不再次接触数据库的情况下遍历数据。在这一点上循环 book.chapters 很简单,所有数据都应该在手边。

请注意,ActiveRecord 仅缓存最后一个查询,因此通过执行不同的查询,例如 Chapter.find_by_book_id_and_title('title') 您之前的 Book.chapters 查询不会被缓存(因为它完全不同)。

于 2010-03-04T07:34:46.767 回答