Activeadmin:paginate_collection with group by并按别名列名排序

时间:2016-08-04 06:56:49

标签: ruby-on-rails-4 activeadmin

我正在使用active-admin显示具有以下查询的用户列表。

SELECT  
agent_id, 
COUNT(*) filter (where price BETWEEN 1 AND 200000) as stat_1, 
from users
group by agent_id
order by stat_1 desc
LIMIT 20 OFFSET 0

Rails标准:

User
.select('agent_id, COUNT(*) filter (where price BETWEEN 1 AND 200000) as stat_1').page(params[:page]).per(20)
.group(:agent_id)
.page(params[:page]).per(20)
.order('stat_1 desc')

在ActivAdmin中

paginated_collection(users) do
  table_for collection, sortable: true do
    ....
    ....
  end
end

但是paginate_collection会抛出错误

PG::UndefinedColumn: ERROR:  column "stat_1" does not exist

SELECT  COUNT(*) AS count_all, agent_id AS agent_id FROM "users" 
GROUP BY "users"."agent_id"  
ORDER BY stat_1 desc LIMIT 20 OFFSET 0

我如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

它不是因为Activeadmin而是因为PostgreSQL。

实际上你试图使用PostgreSql不允许的ORDER BY子句的列别名,并且总是会抛出错误。当你尝试使用别名时,其他子句也会发生同样的情况:

GROUP BY , 的具有下, ORDER BY

通过定义CASE,这个answer就是一个很好的例子。

答案 1 :(得分:0)

我通过更改ActiveAdmin中的paginated_collection.rb行#131

来修复此问题

entries_name = I18n.translate key, count: collection.size, default: entry_name.pluralize

entries_name = I18n.translate key, count: collection.total_count, default: entry_name.pluralize