动态获取两个日期之间的记录

时间:2016-10-26 10:00:52

标签: ruby-on-rails ruby

我正在投资一个项目,我有一个投票系统,在投票模型的索引页面上我可以看到上周的平均投票。但是,我希望能够让用户能够选择平均评级之间的日期。我不确定该怎么做。

目前我有一个显示@average的视图,其定义为:

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

我最初的目的是包括一个'日期范围'属性到模型然后具有从那些日期计算的平均值,这是由索引视图中的表单设置的,但这对于这样一个简单的任务来说似乎是很多开销。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

如你想从模型的角度来实现这一点, 您可以使用rails的动态范围来实现此目的,

在你的模特中,

<强>方法一:

C = np.array([1, 1, 2])

现在,在您的控制器或视图上,您​​可以调用类似的内容,

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

方法2:

您可以采用方法并从方法中调用范围。

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

现在,在您的控制器或视图上,您​​可以调用类似的内容,

<强> 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

Here is the reference

答案 1 :(得分:0)

您可以在索引页面上拥有form_tag和几个date_field_tag(例如start_dateend_date)和提交按钮,也许在顶部。当用户提交时,您可以使用输入的参数,并重新呈现索引。

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

答案 2 :(得分:0)

您可以在index页面

上创建一个简单的表单
<%= form_tag '/index' do %>
  <%= date_field_tag :start_date %>
  <%= date_field_tag :end_date %>
  <%= submit_tag %>
<% end %>

添加路线到您的routes.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