2016-08-04 56 views
0

我正在使用active-admin以顯示具有以下查詢的用戶列表。Activeadmin:paginate_collection與group by和按列別名排序

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 

我怎樣才能解決這個問題?

回答

0

它不是因爲Activeadmin,而是由於PostgreSQL。

其實你要使用列別名使用ORDER BY子句這PostgreSQL將不允許並且總是拋出和error.The同樣與其他條款也發生時您嘗試使用別名,如:

GROUP BYORDER BY

answer有一個很好的例子,通過定義情況下做到這一點。

+0

別名列可以在最新的PostgreSQL使用。問題與paginated_collection沒有采取所有選擇列total_pages計數。 它只需要2列(COUNT(*)AS count_all和agent_id AS agent_id),因此stat_1列在該情況下不存在。 –

+0

@Sonam:我認爲別名方法可以在最新版本下正常工作。 –

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