簡體   English   中英

控制器中的預排序關聯:如何獲得性能提升?

[英]Pre-sorting associations in controller: How and is there a performance gain?

我有一個遍歷@regions的視圖。 對於每個區域,都會顯示其國家。

<% region.countries.each do |country| %>

一個新的要求是按某個列對國家/地區進行排序,我對此有一個范圍。

<% region.countries.order_alphabetically.each do |country| %>

但是,我聽說在視圖中編寫邏輯會嚴重影響性能。 這是真的嗎? 可以在控制器中對其進行預分類嗎?

PS我不想使用default_scope,因為我需要在其他視圖中對它進行不同的排序。

編輯:更改標題以更好地反映我的問題

是否更快可能取決於表中有多少條記錄以及是否在該列上建立索引。 您可以嘗試通過以下方式將此負載傳遞給數據庫:

region.countries.order(:column_name)

在大多數情況下,這應該比將所有記錄加載到Ruby中並進行排序更快。

如果您認為您在3個不同的地方放了

region.countries.order(:column_name)

這將命中數據庫3次。 有人還會認為您使視圖做得太多。 您可以通過以下方式解決這兩個問題

@sorted_countries = region.countries.order(:column_name)

您保留了如何從視圖中進行排序的細節,並且通過重用相同的關系活動記錄將在重用之間緩存已排序的數組。

如果您只在一個地方使用已排序的國家/地區,則應該沒有任何區別,盡管像這樣將其拆分開來,可能會更容易編寫規范來測試國家/地區的排序並降低其可能性您會意外地陷入上述性能陷阱

抱歉回復晚了。 我希望看到一些證據,因此我終於花時間坐下來寫了兩者的基准比較: 視圖排序和控制器演示

在頁面上有很多地區,每個地區都有很多國家。 該頁面將顯示所有這些內容,並按每個區域的名稱對國家/地區進行排序。 運行rake test:benchmark ,結果將保存在tmp / performance文件夾中。 兩者的結果相同,每頁渲染約0.0035。

因此,總而言之,在控制器中的視圖VS中調用排序范圍不會對性能造成任何影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM