2010-12-22 62 views
0

假設我有書籍,每本書都屬於作者。我想打印一份書籍清單以及一些相關的作者信息。我想,作爲初始通,只需使用渴望加載相關記錄,同時加入Rails

@books = Book.all 

以我控制器和

book.author.name 

我認爲,導致@books.count單獨的查詢(即 「N + 1」 的問題)。推薦的解決方案是:

@books = Books.includes(:author) 

將其減少爲一個固定數量的查詢。現在

,如果我需要過濾基於具有與筆者做了一些標準的書單,我會做的控制器

@books = Books.joins(:author).where('name like "%Richler%"') 

但這再次引入了「N + 1」的問題。如果我試圖在查詢中適應.includes(:author),它會嘗試將其拉入兩次,並且name變得模糊不清。在常規的MySQL,我只想用這樣的:

SELECT * FROM books LEFT OUTER JOIN authors ON books.author_id = authors.id 
    WHERE authors.name LIKE "%Richler%"; 

SELECT * FROM books, authors WHERE 
    authors.name LIKE "%Richler%" AND books.author_id = authors.id; 

但短期寫的只是一個SQL查詢字符串,有什麼Railsish的方式來做到這一點?

+0

米蘭的榜樣作品;我想你只需要指定名稱表以避免歧義。 – 2010-12-22 16:26:45

回答

4

這應該做的工作:

Book.joins(:author).where('authors.name like "%Richler%"').includes(:author) 

這應該解僱只有兩個SQL查詢。