ruby-on-rails Rails查询返回数组而不是ActiveRecord

qjp7pelc  于 2023-01-03  发布在  Ruby
关注(0)|答案(2)|浏览(201)

我有这个疑问

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?

ghhaqwfi

ghhaqwfi1#

看起来documents变量是一个数组,而不是ActiveRecord关系,这意味着它没有order方法。
要将order子句添加到查询中,可以按如下所示修改select方法:

documents = Broker.find(12).clients.left_joins(:documents).select("clients.id, count(documents.expiration) FILTER (WHERE documents.expiration < '#{Date.today}') AS expired").group("1").order(expired: :desc)

这将在查询末尾添加一个order子句,根据expired列对结果进行降序排序。
如果你想把documents变量作为一个数组保存,你可以使用sort_by方法根据expired列对数组进行降序排序:

documents = documents.sort_by { |doc| doc.expired }.reverse

这将根据expired列按降序对documents数组进行排序。

68bkxrlz

68bkxrlz2#

这是因为在表达式末尾调用了.group。文档says
根据group属性返回包含不同记录的数组
因此,为了得到一个activecorord关系,你应该排除使用.group

相关问题