用一个字符串排序日期数组

时间:2014-04-08 14:33:21

标签: sql ruby-on-rails ruby arrays

我有一个查询将返回按我的字段'forecast_date'分组的行,但是这个信息可以为null,所以在'group_by'之后,我设置一个字符串'Without Forecast'作为行的键没有forecast_date。

当我想显示行时,我需要通过forecast_date订购,但是rails会给我一个错误:

orders.keys给我[Tue, 08 Apr 2014, 'N/A', Tue, 09 May 2013, 01 Jan 2012]

我试着这样:

@orders = Orders.where('customer_id = 9');
orders = @orders.group_by { | order | order.forecast_date.try(:to_date) } 

orders.keys.sort # And obtain this error
ArgumentError: comparison of Date with String failed

如何避免这种情况并正确排序行?

2 个答案:

答案 0 :(得分:0)

您可以将块传递给sort方法,该方法确定如何比较数组元素。根据{{​​3}}:

  

该块必须实现a和b之间的比较,并且当a跟随b时返回-1,当a和b相等时返回0,或者如果b跟随a则返回+1。

因此,对数组进行排序可能如下所示:

array.sort do |a, b|
    if a.is_a?(String)
        1
    elsif b.is_a?(String)
        -1
    else
        a <=> b
    end
end

但是,我不确定这是否是最干净的方法。

答案 1 :(得分:0)

不确定你的Orders表是什么样的,但你可以做这样的事情

Order.where(customer_id: 9).order("forecast_date")

SQL

SELECT orders.* FROM orders ORDER BY forecast_date

这将按预测日期订购您的订单,最后为零。如果您想要某个特定日期的订单数量,您可以这样做

Order.where(customer_id: 9).order("forecast_date").group("forecast_date").select("count(id) as number_of_orders, forecast_date")

SQL

SELECT Count(id) as number_of_orders, forecast_date FROM orders WHERE orders.customer_id = 9 GROUP BY forecast_date ORDER BY forecast_date

这将返回一个ActiveRecord :: Relation对象,其中forecast_datenumber_of_orders的方法结尾为nil forecast_date

获取您可以调用的日期(最后将返回一个日期数组为nil)

@orders.map(&:forecast_date)

你也可以将这些

作为范围
scope :by_customer,->(id){ where(customer_id: id) }
scope :grouped_by_forecast_date,->{order("forecast_date").group("forecast_date").select("count(id) as number_of_orders, forecast_date")} 

然后您可以拨打Order.by_customer(customer_id).grouped_by_forecast_date