這樣做好嗎?它可以傷害嗎?
這絕對沒問題,但問題是你會調用另一個數據庫查詢 - 這是Rails應用程序中最「昂貴」的部分。
@instance_variables
設置一次,並且可以在整個視圖中使用:
#app/views/articles/show.html.erb
#Referencing @article references stored data, not a new DB query
<%= @article.title %>
<%= @article.description %>
<%= @article.created_at %>
由於上述所有使用所存儲的@article
數據,數據庫,只有當在創建@article
擊中一次(控制器)。
如果調用視圖中的AR方法,你基本上每次調用一個新的數據庫調用:
#app/views/articles/show.html.erb
#Bad practice
<%= Article.select(:name).find(params[:id]) %>
<%= Article.select(:description).find(params[:id]) %>
<%= Article.select(:created_at).find(params[:id]) %>
直接回答你的問題,你會好起來的調用數據IF您只計算特定於數據庫的數據。
IE如果你想算的@articles
數量,你可以調用@articles.size
(ActiveRecord: size vs count)
謹慎的開發商將決定它們在其控制器的數據,以及他們需要從DB拉...做所有他們的分貝工作在控制器中:
#app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
def index
@articles = Article.where(approved: true) #-> could use a scope here if you wanted
end
end
#app/views/articles/index.html.erb
<%= @articles.size %>
Nithin
的答案是偉大的,但不會得到過去,你必須確定你是否需要調用的代價db explici tly,或者使用已經調用的數據。
最後,關於使用部分,如果你要傳遞數據每的時候,你不妨用某種條件的數據,以確定是否需要調用數據庫與否:
#app/views/shared/_partial.html.erb
<% approved ||= Article.approved_articles.size %>
<% short ||= Article.short_answer_presence.size %>
這將允許你設置當地人,如果你想要的話,也有「默認值」設置,如果他們沒有設置。
太棒了,謝謝你的詳細解答。我會走這條路。只是好奇,從我看來直接從視圖中調用它會傷害嗎? @Nithin – Kathan
這不會是一個問題,但它不會遵循rails DRY概念。儘管如此,並不是很好的方法。 – Nithin