我有一个查询将返回按我的字段'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
如何避免这种情况并正确排序行?
答案 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_date
和number_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