2016-10-26 48 views
0

我正在製作一個項目,此刻我擁有投票系統,並且在投票模式的索引頁面上可以看到上週的平均投票數。不過,我希望能夠讓用戶能夠選擇平均評分之間的日期。我不知道如何去做這件事。在兩個日期之間動態獲取記錄

目前我有其示出@average的視圖,其被定義爲:

Vote.where(date: (Date.today - 7)..(Date.today)).average(:score) 

我最初雖然是包含'日期範圍屬性到模型,然後具有與日期計算的平均,它由索引視圖中的表單設置,但對於這樣一個簡單的任務而言,這看起來像是一個很大的開銷。

任何幫助將不勝感激。

+0

而是模型屬性的,你可以寫在模型中一個類的方法,接受起始日期日期和結束日期作爲參數。 – Santhosh

+0

感謝您的幫助,所以如果我創建了這個方法,那我該如何讓用戶提交自己的start_date和end_date的值? – user2320239

回答

1

當你想從來看, 您可以使用軌道的動態範圍來實現這一目標的模式來看實現這一目標,

在模型中,

方法一:

class Vote < ActiveRecord::Base 
    scope :average_score, ->(date1,date2) { where(date: (date1)..(date2))} 
end 

現在,在您的控制器或視圖上,您​​可以調用類似於

@average = Vote.average_score(Date.today - 7 , Date.today).average(:id)

方法2:

您可以採取的方法和調用從法的範圍。現在

class Vote < ActiveRecord::Base 
     scope :average_score, ->(date1,date2) { where(date: (date1)..(date2))} 

     def self.average_score_value(d1, d2) 
     self.average_score(d1,d2).average(:id) 
     end 
end 

,控制器或視圖上,你可以調用類似,

@average = Vote.average_score_value(Date.today - 7 , Date.today)

下面是一個例如與用戶表,我已created_at

2.3.1 :036 > User.average_score(Date.today - 7,Date.today).average(:id) 

(0.5ms) SELECT AVG(`users`.`id`) FROM `users` WHERE (`users`.`created_at` BETWEEN '2016-10-19' AND '2016-10-26') 
=> nil 

範圍是

scope :average_score, ->(date1,date2) { where(created_at: (date1)..(date2))}

Here is the reference

+0

@ user2320239,請檢查這個答案。你可以在模型本身實現 – Sravan

+0

感謝您的幫助,所以如果我創建該方法,那麼我如何允許用戶提交自己的start_date和end_date的值,然後進行頁面更新? – user2320239

+0

我也沒有綁定在模型中做這件事,如果它可以做的另一種方式更容易,我很好。 – user2320239

0

你可以有一個form_tag和幾個date_field_tag S(比如start_dateend_date)和一個提交索引頁本身的按鈕,或許在頂部。當用戶提交時,您可以使用輸入的參數,並重新渲染索引。

@average = Vote.where(date: (params[:start_date].to_date)..(params[:end_date].to_date)).average(:score) 
render :index 
0

您創建index頁面

<%= form_tag '/index' do %> 
    <%= date_field_tag :start_date %> 
    <%= date_field_tag :end_date %> 
    <%= submit_tag %> 
<% end %> 

一個簡單的形式添加路由到您的路線。RB

post '/index', to 'users#average' 

添加一個方法來UsersController

def average 
    @average = Vote.where(date: (params[:start_date].to_date)..(params[:end_date].to_date)).average(:score) 
    render :index 
    end 
相關問題