2015-07-16 9 views
6

Ho modello Deal che ha un attributo chiamato 'info' con questa struttura:query una serie di JSON con Active Record (Rails 4/postgresql9.4)

All'interno della colonna 'informazioni' sul Deal:

Deal1.info = [{"deal_id":"4","text1":"qqq","text2":"sqsq","image1":"sqqs","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}] 

# no image here inside the json 
Deal2.info = 
[{"deal_id":"4","text1":"qqq","video1":"sqsq"},{"deal_id":"5","text1":"sqqs","text2":"qq"}] 

la colonna è stata definita nel mligration come jSON

add_column :deals, :info, :json, default: '[]' 

come posso interrogare questo in jsonb con record attivo?

  • trovare tutte le offerte in cui informazioni contengono almeno una deal_id = 4

  • trovare tutti i accordo in cui informazioni contengono a affinchè non un blocco JSON ({}) con una chiave denominata 'immagine 1' (si dovrebbero emesso solo Deal1, e non deal2)

risposta

12

avevo una colonna simile e ho dovuto cambiare il tipo di colonna da json a jsonb.

add_column :deals, :info, :jsonb, default: [], null: false, index: true

Dopo avere ottenuto il tipo di dati per jsonb sono stato in grado di eseguire questo tipo di query ActiveRecord.

Info.where('deals @> ?', '[{"deal_id":"4"}]')

io non sono del tutto sicuro di come scrivere tutte queste ma con ActiveRecord (http://www.postgresql.org/docs/9.4/static/functions-json.html#FUNCTIONS-JSONB-OP-TABLE) per raggiungere il tuo 2 ° punto di proiettile.

Problemi correlati