2016-08-04 10 views
0

Ich benutze Active-Admin, um Liste der Benutzer mit der folgenden Abfrage anzuzeigen.ActiveAdmin: paginate_collection mit Gruppe nach und nach Alias ​​Spaltenname sortieren

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 Standard:

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') 

In ActivAdmin

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

Aber paginate_collection wirft Fehler

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 

Wie ich dieses Problem lösen können?

Antwort

0

Es ist nicht wegen ActiveAdmin, sondern aufgrund der PostgreSQL.

Eigentlich BY-Klausel Sie versuchen, mit ORDER Spalte Alias ​​zu verwenden, die PostgreSql wird nicht zulassen, und wird immer ein Fehler haben.Kamera werfen gleiche geschieht mit anderen Klausel auch, wenn Sie versuchen, wie Alias ​​zu verwenden:

GROUP BY, mit, ORDER BY etc

Diese answer haben ein gutes Beispiel es CASE durch die Definition zu tun.

+0

alias Spalte in neuester PostgreSql verwendet werden kann. Problem mit paginated_collection, bei dem nicht die gesamte select-Spalte für die Gesamtzahl der Seiten gezählt wird. Es dauert nur 2 Spalten (COUNT (*) AS count_all und agent_id AS-Agent-ID) so stat_1 Spalte ist in diesem Fall nicht vorhanden. –

+0

@Sonam: Ich denke, Alias-Methode funktioniert gut mit der neuesten Version. –

0

ich dieses Problem behoben, indem in paginated_collection.rb Linie # 131 in ActiveAdmin

Ändern

von

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

zu

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