0

我有以下Rails代碼,其中它技術上最多做兩個查詢,但由於某種原因,控制檯顯示三個不同的查詢,如下面的屏幕截圖所示。我的問題是爲什麼它會在沒有必要時運行SELECT "pages".* FROM "pages"查詢?爲什麼Rails會運行額外的不必要查詢?

查詢

page = Page.includes(:page_roles) 
    page.where(is_deleted: false).index_by(&:name) 
    page_results = {} 
    page.each do |entry| 
     result_entry = entry.as_json; 
     result_entry['page_roles'] = entry.page_roles 
     page_results[entry.name] = result_entry 
    end 

控制檯輸出

Page Load (0.0ms) SELECT "pages".* FROM "pages" WHERE "pages"."is_deleted" = $1 [["is_deleted", false]] 
PageRole Load (0.5ms) SELECT "page_roles".* FROM "page_roles" WHERE "page_roles"."page_id" IN (1, 2, 3, 4) 
Page Load (0.5ms) SELECT "pages".* FROM "pages" 
CACHE (0.0ms) SELECT "page_roles".* FROM "page_roles" WHERE "page_roles"."page_id" IN (1, 2, 3, 4) 
Completed 200 OK in 117ms (Views: 16.9ms | ActiveRecord: 17.0ms) 

Screenshot of the console

+2

請從控制檯輸入代碼,無法辨認。 – Iceman

+0

對不起,更新了問題 –

+0

它實際上是4個查詢。 –

回答

1

這裏的原因:

page = Page.includes(:page_roles) 
page.where(is_deleted: false).index_by(&:name) # your first two queries (pages + page_roles). 
               # query is triggered by index_by (method of enumerable, not activerecord) and result is ignored 
               # as it's not saved anywhere. 

page_results = {} 
page.each do |entry| # your second two queries. Note that this one doesn't use `is_deleted: false` filter. 
        # page_roles query is served from cache as it didn't change. 
    result_entry = entry.as_json; 
    result_entry['page_roles'] = entry.page_roles 
    page_results[entry.name] = result_entry 
end 
+0

豈不'page'仍然有以前附加方法?例如,在執行'page.each'時,'page'變量仍然不包含先前附加的方法'page.includes(:page_roles)'和'page.where(is_deleted:false).index_by(&:name )'? –

+0

'includes' - 是的(因爲它被保存到'pages')。另一個 - 不。 –

0

我相信這是因爲你已經得到了page.where查詢將仍然使用ActiveRecord的查詢界面在頁表上,而不是使用Acti存儲爲page的veRecord集合。

1

那是因爲第一項任務。您可以做空做了這一切:

page_results = 
    Page 
    .includes(:page_roles) 
    .where(is_deleted: false) 
    .group_by(&:name) 
+0

我這樣做是因爲,如果不嘗試從結果項中訪問'page_roles'屬性,那麼該屬性將保持未設置狀態。 –

+0

我看到這個問題,你可以使用一個串行然後https://github.com/rails-api/active_model_serializers/blob/master/docs/general/getting_started.md –

相關問題