![](/img/trans.png)
[英]Is there any other way to get the count of records in the list<classmodel> in .cshtml?
[英]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
加盟
最重要的是你必須加入可以加入的協會。 如果您有很長的數據庫獲取列表,請查看您的服務器日志並查看何時顯示該頁面。 例如,如果您的Product
與User
相關聯,您將看到您的產品列表中有一個“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.