0

je un modèle « d'audit » avec le nom: la chaîne et les données: attributs hstore - comme suit:Rails et Postgres, groupe par hstore

#<Audit 
id: 1, 
name: "my audit", 
data: {"publisher"=>"some publisher", "display_version"=>"17.012.20098"}, 
created_at: "2017-10-10 13:09:56", 
updated_at: "2017-10-10 13:09:56"> 

Je veux un rapport qui contient 3 colonnes: nom , display_version, compter

pour cela, je suppose que je dois groupe par « nom » et « données -> « display_version » »

Je me bats avec la requête et la syntaxe AR.

Ce que j'ai à ce jour est:

Parent.audits.group(:name, :data -> 'display_version)' 

Même cela ne fonctionne pas. Quelqu'un peut-il aider? J'ai cherché des exemples sans aucune chance.

Répondre

0

Utilisation jsonb au lieu de hstore (pour diverses raisons)

modèle 'Audit' avec le nom: la chaîne et les données: jsonb

Audit.rb

store_accessor :data, :publisher, :display_version 

Ensuite, essayez:

Parent.audits.pluck(:name, :publisher, :display_version) 

Good Resource on JSONB and Postgresql

hstore columns don’t allow a nested structure; they also store all values as strings, which will require type coercion on both database and application layers. With json/jsonb columns you don’t have this problem; numbers (integers/float), booleans, arrays, strings and nulls are accepted, and you can even nest structures in any way you want.

The recommendation is that you stop using hstore in favor of jsonb; just remember that you have to use PostgreSQL 9.4+ for this to work.

+0

Informations utiles mais il ne répond pas à la question. – user3565039

0

Vous pouvez passer une chaîne contenant l'expression de regroupement SQL pour group vous pourriez dire ainsi:

Parent.audits.group(%q{name, data -> 'display_version'}) 

ou:

Parent.audits.group(%q{audits.name, audits.data -> 'display_version'}) 

Et alors vous pourriez jeter un appel #count à la fin pour obtenir les données que vous voulez:

Parent.audits.group(%q{name, data -> 'display_version'}).count 
+0

Merci. Cela donne: ActiveRecord :: StatementInvalid: PG :: GroupingError: ERROR: la colonne "audits.id" doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégat – user3565039

+0

Désolé, le 'count' a été manqué. Je viens de mettre à jour la réponse. –