簡體   English   中英

Rails 4 列出模型中所有記錄的更快方法

[英]Rails 4 A Faster way to list all records in Model

我有一個 Products 模型,里面有 6,000 條記錄(不多)。 當我在視圖中運行循環以簡單地列出表中的所有記錄時,類似於此..

<% Product.all.each do |product|  %>
   <%= product.serial_number %> <br />
<% end %>

它需要 13.02 秒才能加載到我的視圖中並在網頁中顯示我的記錄。 這在我的 dev ENV 和 prod ENV 中,我嘗試使用 MySQL 和 sqlite 數據庫。 好像沒什么區別。

但是,當我在 Rails 控制台中運行此查詢時,它會在 88.2 毫秒(不到 1 秒)內完成。

什么能阻止這個?

你追求一個領域? 使用pluck 這正是它的用途。

<% Products.pluck(:serial_number).each do |serial_number| %>
   <%= serial_number %> <br />
<% end %>

這既生成了更高效的 SQL(一個select serial_number而不是select * )並繞過了為每個返回的結果實例化 ActiveRecord 對象的步驟,只是為了您可以訪問該模型的單個屬性。

但是,當我在 Rails 控制台中運行此查詢時,它會在 88.2 毫秒(不到 1 秒)內完成。

除非你真的開始迭代結果,否則 Rails 不會任何事情。 Rails 僅在您嘗試訪問結果時才實際實例化記錄。


回復:你的評論

然而,我實際上只是在上面展示了一個例子。 我實際上顯示了每條記錄的所有字段。 這有什么技巧嗎?

然后,您不應該使用循環,如您的示例所示。 使用部分和集合渲染,這比自己迭代結果快得多。

創建一個名為app/views/products/_product.html.erb ,並將循環的“主體”放入該文件中。 它可能看起來像這樣:

<div class="product">
  Name: <%= link_to product, product.name %><br/>
  Serial Number: <%= product.serial_number %>
</div>

然后,在頂級視圖中,使用該 parial 渲染整個集合:

render partial: 'product', collection: Product.all

加盟

最重要的是你必須加入可以加入的協會。 如果您有很長的數據庫獲取列表,請查看您的服務器日志並查看何時顯示該頁面。 例如,如果您的ProductUser相關聯,您將看到您的產品列表中有一個“SELECT”,然后是您的用戶的數百個“SELECT”。 您可能想要使用此語法

<% Products.joins(:user).each do |product|  %>
  <%= product.serial_number %> <br />
<% end %>

請注意,您必須適應您的代碼(我以user為例),這完全取決於您的關聯。 此處的指南中查看更多信息

請注意, joins執行“內部聯接”,並將刪除所有引用為零的記錄。 如果是您的情況,您可以通過使用includes來使用“急切加載”技術:

Products.includes(:user).each do |product|

Find_each

或者,嘗試使用find_each它將分批處理您的記錄以節省服務器電源。 指南中查看有關它的更多詳細信息

Products.find_each do |product| 

緩存

或者,您可以使用緩存來提高性能

Products.find_each do |product|
  cache product do
    ...
  end
end

分頁

如果可能,還可以考慮使用分頁來限制從數據庫中提取的記錄數

暫無
暫無

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

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