2015-07-16 17 views
6

mam Deal modelu, który ma atrybut o nazwie „informacji” z tej struktury:Zapytanie tablicą JSON z Active Record (szyny 4/postgresql9.4)

wewnątrz kolumny „o” na 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"}] 

kolumna została zdefiniowana w mligration jako json

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

jak mogę kwerendy to w jsonb z aktywnego rekordu?

  • znaleźć wszystkie oferty gdzie informacje zawierają co najmniej jeden deal_id = 4

  • znaleźć całą ofertę gdzie informacje zawierać co zeby bloku json ({}) z kluczem o nazwie „Image1” (to należy tylko wyjście Deal1, a nie deal2)

Odpowiedz

12

miałem podobną kolumnę i musiałem zmienić typ kolumny z json do jsonb.

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

Po zdobyciu typ danych do jsonb byłem w stanie wykonać tego typu kwerendy ActiveRecord.

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

Nie jestem pewien, jak napisać wszystko to jeszcze z ActiveRecord (http://www.postgresql.org/docs/9.4/static/functions-json.html#FUNCTIONS-JSONB-OP-TABLE), aby osiągnąć swój 2nd podpunkt.

Powiązane problemy