Rails => n+1的問題和includes

ck100pro
ck100pro
Published in
2 min readDec 19, 2019

最近用actioncable做作品的時候,發現了一個問題由於一個聊天室裡面有很多的使用者,而每位使用者會有一堆訊息所以在這樣的情況下很容易發生n+1的狀況。

先貼上範例的html程式碼,在這段程式碼內會印出這間聊天室內的所有訊息並顯示這段訊息所屬的user_id碼。

以下這段程式碼會把@board這個房間內的所有訊息撈出來,並印在畫面上,這邊我們先用all來撈出所有message。

回到畫面,畫面上訊息都正常顯示,讓我們回到rails c來看,當我們每撈出一筆message就會就會再去撈一次他的user,所以我們可以用includes方法來解決這個問題。

我們將controller的@board_messages的all改成includes,來看看結果會呈現出怎樣。

我們來看一下rails c 的內容,我們這邊可以看到當我們在撈所有的boardmessage時也會同時把所有相關連的user一起撈出來。

在撈資料的時候可以用includes這個 方法把相關連的資料一起抓出來,這樣在實做上方便也可以減少資料庫的負擔。

--

--