關於

因為連續兩次面試都被問到這問題( Orz ),想用這機會整理

當前端需要一整串資料

  @books = Book.limit(10)
  <% @books.each | book | %>
    <p> <%= book.name  %></p>
    <p> <%= book.author %></p>
    <p> <%= book.company.name %></p>
  <% end %>

Book.limit(10) 第一次會先撈前 10 筆 book 紀錄,但因為 book.company.name 會造成需要多額外十次 company 查詢

解決

因此用 includes,確保資料表關聯

 @books = Book.includes(:company).limit(10)
 SELECT * FROM books LIMIT 10
 SELECT companies.* FROM companies WHERE (companies.book_id IN (1,2,3,4,5,6,7,8,9,10))

參考

RailsGuides- Active Record 查詢

Rails 3 種做到 eager loading 方法

Rails 使用 include 和 join 避免 N+1 query