2015-12-20 69 views
2

使用Rails 4它是確定調用ActiveRecord的方法在視圖中的Rails

我想知道(和有一個很難找到答案)如果是OK直接從視圖調用ActiveRecord的方法,如:

<%= Article.where(approved: true).count %> 

<%= Article.where("short_answer is NOT NULL and short_answer != ''").count %> 

我知道通常的做法是把這些在一個實例變量存儲在控制器內,但因爲我使用的部分,我不能這樣做。

這樣做好嗎?它可以傷害嗎?有沒有更好的方法來解決這個問題(比如輔助方法)?謝謝!

回答

2

這樣做好嗎?它可以傷害嗎?

這絕對沒問題,但問題是你會調用另一個數據庫查詢 - 這是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.sizeActiveRecord: 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 %> 

這將允許你設置當地人,如果你想要的話,也有「默認值」設置,如果他們沒有設置。

1

您可以隨時通過這些變量的部分用當地人裏面:

<%= render partial: "form", locals: {zone: @zone} %> 

它總是一個很好的做法,定義控制器的實例變量,它不會傷害,但你最終不會做的業務邏輯在視圖內。

1

你應該主要是做

class Article < ActiveRecord::Base 
.... 

    scope :approved_articles, where(approved: true) 
    scope :short_answer_presence, where("short_answer is NOT NULL and short_answer != ''") 
end 

在你的控制器的方法

@approved_articles_count  = Article.approved_articles.count 
@short_answer_presence_count = Article.short_answer_presence.count 

,並在視圖中使用這些變量。

在部分情況下,正如我說的拉曼,你可以做到這一點。

<%= render partial: "form", locals: {approved_articles_count: @approved_articles_count, short_answer_presence_count: @short_answer_presence_count} %> 
+0

太棒了,謝謝你的詳細解答。我會走這條路。只是好奇,從我看來直接從視圖中調用它會傷害嗎? @Nithin – Kathan

+0

這不會是一個問題,但它不會遵循rails DRY概念。儘管如此,並不是很好的方法。 – Nithin

相關問題