我有这个疑问
documents = Broker.find(12).clients.left_joins(:documents).select("clients.id, count(documents.expiration) FILTER (WHERE documents.expiration < '#{Date.today}') AS expired").group("1")
它返回一个表,如下所示:
| 身份证|过期|
| - ------| - ------|
| 1个|四个|
| 第二章|三个|
| 五个|1个|
| 六个|第二章|
我想在查询后添加一个order
,例如:
documents.order("expired")
但我得到了这个错误:
NoMethodError (undefined method `order' for []:array)
如何才能获得ActiveRecord而不是Array?
2条答案
按热度按时间ghhaqwfi1#
看起来documents变量是一个数组,而不是ActiveRecord关系,这意味着它没有order方法。
要将order子句添加到查询中,可以按如下所示修改select方法:
这将在查询末尾添加一个order子句,根据expired列对结果进行降序排序。
如果你想把documents变量作为一个数组保存,你可以使用sort_by方法根据expired列对数组进行降序排序:
这将根据expired列按降序对documents数组进行排序。
68bkxrlz2#
这是因为在表达式末尾调用了
.group
。文档says:根据group属性返回包含不同记录的数组
因此,为了得到一个activecorord关系,你应该排除使用
.group
。