【问题标题】:Dynamically get records between two dates动态获取两个日期之间的记录
【发布时间】:2016-10-26 19:06:41
【问题描述】:

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

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

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

我最初的想法是在模型中包含一个“日期范围”属性,然后根据这些日期计算平均值,这是由索引视图中的表单设置的,但这似乎是这样的一个很大的开销简单的任务。

任何帮助将不胜感激。

【问题讨论】:

  • 你可以在模型中编写一个类方法来代替模型属性,它接受 start_date 和 end_date 作为参数。
  • 感谢您的帮助,如果我创建了该方法,我该如何允许用户提交自己的 start_date 和 end_date 值?

标签: ruby-on-rails ruby


【解决方案1】:

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

在您的模型中,

方法一:

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)

方法二:

您可以获取一个方法并从该方法中调用作用域。

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, -&gt;(date1,date2) { where(created_at: (date1)..(date2) )}

Here is the reference

【讨论】:

  • @user2320239,请检查此答案。您可以在模型本身中实现
  • 感谢您的帮助,如果我创建了该方法,如何允许用户提交自己的 start_date 和 end_date 值,然后更新页面?
  • 我也不会在模型中执行此操作,如果可以以另一种更简单的方式完成,我可以接受。
  • 好答案。我们也可以在模型中做平均,只是为了把它都放在一个地方...def self.average_score_value(d1, d2); self.average_score(d1,d2).average(:id); end 然后 OP 可以做@average = User.average_score_value(from_date, to_date)
  • 你可以只给两个下拉菜单和一个按钮,然后点击按钮,你可以从控制器调用这个范围。
【解决方案2】:

您可以在索引页面本身(可能在顶部)有一个form_tag 和几个date_field_tags(比如start_dateend_date)和一个提交按钮。当用户提交时,您可以使用输入的参数,并重新渲染索引。

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

【讨论】:

    【解决方案3】:

    您在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
    

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 2012-10-17
      • 2013-04-16
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      相关资源
      最近更新 更多