2014-06-27 89 views
1

爲什麼Ruby on Rails框架不提供一種方法來理解我正在執行的操作是否會導致查詢?Rails ORM查詢結果

採取的是有很多文章

在我看來,我會做一個用戶:

<% @user.posts.each do |p| %> 
    <%= p.title %> 
<% end %> 

我也沒辦法,看在我的控制器我做

@user = User.find(params[:id]).includes(:posts) 

即急於加載,並導致一個查詢,左連接,或者如果我這樣做:

@user = User.find(params[:id]) 

導致N + 1個查詢

如果應用程序是簡單的,不會有任何問題,但讓我們一個更大的應用程序。 也許查詢方法不在控制器中,而是在模型中。也許它甚至不在模型中,但在一個問題中(一個外部模塊,包括我的模型)。

換句話說,我的印象是失去了控制框架在我的數據庫中所做的事情。

您是否發現此問題的任何解決方案?

+4

您可以在應用程序中添加子彈寶石將提示N + 1個查詢 – Icicle

+0

事實上,'includes'不會引發查詢與左檢查的加入,但兩個查詢。 http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations – Iceman

+0

你也可以用這個寶石來幫助你:https://github.com/flyerhzm/bullet – juanitofatas

回答

1

你可以在你的應用程序,它會提示對於n加子彈寶石+ 1查詢

添加這種寶石在你的應用

gem "bullet", :group => "development" 

添加下面的設置在配置文件中的config /環境/發展。 RB

config.after_initialize do 
    Bullet.enable = true 
    Bullet.alert = true 
    Bullet.bullet_logger = true 
end 

之後,你應該能夠監測N + 1查詢

更多可以參考以下鏈接

https://github.com/flyerhzm/bullet