【问题标题】:Filtering by created_at (start_datetime and end_datetime) picks only one date which is end_datetime按 created_at 过滤(start_datetime 和 end_datetime)只选择一个日期,即 end_datetime
【发布时间】:2018-10-17 09:56:57
【问题描述】:

我正在尝试为我的 revenue_controller 显示操作创建一个过滤器,但效果不佳。

这是我在下面的代码中所做的,但是当我按日期过滤时,它会单独选择 end_datetime

revenue_controller.rb

我在show 操作中尝试做的是将我的搜索默认为从现在开始的 30 天,如果参数填充了日期,则使用选定的日期时间。

module Admin
  module Statistic
    class RevenuesController < BaseController

      def show
        @revenues_reports = Currency.all.map do |currency|
          puts params
          start_datetime = if params[:created_at].nil? then
                             30.days.ago
                           else
                             params[:created_at].slice(0..15)
                           end
          end_datetime = if params[:created_at].nil? then
                           Time.now
                         else
                           params[:created_at].slice(0..15)
                         end
          get_revenue_report_for_currency(currency, start_datetime, end_datetime)
        end
      end

      def get_revenue_report_for_currency(currency, start_datetime, end_datetime)
        puts "start: #{start_datetime}" # I added this to see from the log the start_datetime it picks
        puts "end: #{end_datetime}" # I added this to see from the log the end_datetime it picks
        total_withdraw_fees_charged = Withdraw.where(:currency => currency.id, :created_at => start_datetime..end_datetime).sum(:fee)
        total_withdraw_network_fees_charged = 0.3 * total_withdraw_fees_charged
        net_income_from_withdraws = total_withdraw_fees_charged - total_withdraw_network_fees_charged

        total_sell_order_fees_charged = Order.where(:type => 'OrderAsk', :bid => currency.id, :created_at => start_datetime..end_datetime).sum(:fee)
        total_buy_order_fees_charged = Order.where(:type => 'OrderBid', :ask => currency.id, :created_at => start_datetime..end_datetime).sum(:fee)
        total_trading_fees = total_sell_order_fees_charged + total_buy_order_fees_charged

        total_fees = net_income_from_withdraws + total_trading_fees

        {
          currency: currency.code.upcase,
          total_withdraw_fees_charged: total_withdraw_fees_charged,
          total_withdraw_network_fees_charged: total_withdraw_network_fees_charged,
          net_income_from_withdraws: net_income_from_withdraws,
          total_sell_order_fees_charged: total_sell_order_fees_charged,
          total_buy_order_fees_charged: total_buy_order_fees_charged,
          total_trading_fees: total_trading_fees,
          total_fees: total_fees
        }
      end
    end
  end
end

show.html.erb

.panel.panel-primary
  .panel-heading
    h4.panel-title = t('admin.statistic.filter')
  .panel-body
    = form_tag(admin_statistic_revenue_path, :method => 'get', class: 'form-horizontal') do |f|
      .row
        .col.col-xs-3
          label[for="#"]
            | Start Date:
            input.form-control.created_at.date_time_filter.from[name="[created_at]" type="#" value=""]
        .col.col-xs-3
          label[for="#"]
            | End Date:
            input.form-control.created_at.date_time_filter.to[name="[created_at]" type="#" value=""]
        = button_tag "Search", :class => 'btn btn-info', :name => nil

浏览器参数网址

http://localhost:3000/admin/statistic/revenue?utf8=%E2%9C%93&%5Bcreated_at%5D=2018-08-01+00%3A00&%5Bcreated_at%5D=2018-10-05+00%3A00

开发日志

【问题讨论】:

    标签: ruby-on-rails ruby slim-lang


    【解决方案1】:

    您正在尝试为两个不同的参数 created_at_fromcreated_at_to 使用单个参数名称:

        .col.col-xs-3
          label[for="#"]
            | Start Date:
            input.form-control.created_at.date_time_filter.from[name="created_at_from" type="#" value=""]
        .col.col-xs-3
          label[for="#"]
            | End Date:
            input.form-control.created_at.date_time_filter.to[name="created_at_to" type="#" value=""]
    

    created_at 通常是datetime,因此对于大多数记录来说,时间都是非零的。 并且2018-10-05 12:34:56 +0100 大于2018-10-05 00:00:00

    “在特定日期创建的记录”的正确过滤器是“在该天开始之后创建的记录,但在当天之前和当天”:

    start_datetime = if params[:created_at_from].present?
                       Time.zone.parse(params[:created_at_from]).beginning_of_day
                     else
                       30.days.ago
                     end
    end_datetime = if params[:created_at_to].present?
                     Time.zone.parse(params[:created_at_to]).end_of_day
                   else
                     Time.zone.now
                   end
    

    另请注意zone,因为根据时区,一天可能会在不同的世界时间开始。

    【讨论】:

    • 它可以工作,但有问题。那就是:{"utf8"=&gt;"✓", "created_at_from"=&gt;"2018-10-01 00:00", "created_at_to"=&gt;"2018-10-05 00:00", "action"=&gt;"show", "controller"=&gt;"admin/statistic/revenues"}start: 2018-10-01 00:00:00end: 2018-10-05 23:59:59所以我删除了end_of_daybeginning_of_day方法,因为我不需要它。
    • 谢谢@Vasfed
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多