Тип данных Postgres JSON Rails

Я использую тип данных json Postgres, но хочу сделать запрос/заказ с данными, которые вложены в json.

Я хочу заказать или запросить с .where по типу данных json. Например, я хочу запросить пользователей, у которых есть число следящих > 500, или я хочу заказать последователь или следующий счет.

Спасибо!

Пример:

model User

data: {
     "photos"=>[
       {"type"=>"facebook", "type_id"=>"facebook", "type_name"=>"Facebook", "url"=>"facebook.com"}
      ], 
     "social_profiles"=>[
         {"type"=>"vimeo", "type_id"=>"vimeo", "type_name"=>"Vimeo", "url"=>"http://vimeo.com/", "username"=>"v", "id"=>"1"},
         {"bio"=>"I am not a person, but a series of plants", "followers"=>1500, "following"=>240, "type"=>"twitter", "type_id"=>"twitter", "type_name"=>"Twitter", "url"=>"http://www.twitter.com/", "username"=>"123", "id"=>"123"}
     ]
}

Ответ 1

Для всех, кто наткнется на это. Я придумал список запросов с использованием типа данных ActiveRecord и Postgres 'JSON. Не стесняйтесь редактировать это, чтобы сделать его более понятным.

Команды ретрансляции Postgres:

# Sort based on the Hstore data:
2.1.1 :022 > Post.order("data->'hello' DESC")

=> #<ActiveRecord::Relation [#<Post id: 4, created_at: "2014-04-16 01:05:49", updated_at: "2014-04-16 01:05:49", data: {"hi"=>"23", "hello"=>"22"}>, #<Post id: 3, created_at: "2014-04-16 01:05:37", updated_at: "2014-04-16 01:05:37", data: {"hi"=>"13", "hello"=>"21"}>, #<Post id: 2, created_at: "2014-04-16 01:05:28", updated_at: "2014-04-16 01:05:28", data: {"hi"=>"3", "hello"=>"2"}>, #<Post id: 1, created_at: "2014-04-16 01:05:05", updated_at: "2014-04-16 01:05:05", data: {"hi"=>"2", "hello"=>"1"}>]> 



# Where inside a JSON object:
Record.where("data ->> 'likelihood' = '0.89'")

# Searching nested json object:
2.1.1 :130 > r.column_data
 => {"data1"=>[1, 2, 3], "data2"=>"data2-3", "array"=>[{"hello"=>1}, {"hi"=>2}], "nest"=>{"nest1"=>"yes"}} 

2.1.1 :130 > Record.where("column_data -> 'nest' ->> 'nest1' = 'yes' ")

# Searching within array:
Record.where("column_data #>> '{data1,1}' = '2' ")


# Searching within a value that’s an array:
Record.where("column_data #> '{array,0}' ->> 'hello' = '1' ")
# this only find for one element of the array. 

# All elements:
Record.where("column_data ->> 'array' LIKE '%hello%' ")
# This is advised against in rails, use below:
Record.where("column_data ->> 'array' LIKE ?", "%hello%")

Обновление Я скоро напишу сообщение в блоге и поставлю ссылку здесь.

Ответ 2

Ваш вопрос не соответствует данным, которые вы указали, но если ваша таблица имеет имя users и data - это поле в этой таблице с JSON, например {count:123}, тогда запрос

SELECT * WHERE data->'count' > 500 FROM users

будет работать. Взгляните на схему базы данных, чтобы убедиться в том, что вы понимаете макет и убедитесь, что запрос работает, прежде чем усложнять его соглашениями Rails.

Ответ 3

В соответствии с этим http://edgeguides.rubyonrails.org/active_record_postgresql.html#json существует разница в использовании -> и ->>:

# db/migrate/20131220144913_create_events.rb
create_table :events do |t|
  t.json 'payload'
end

# app/models/event.rb
class Event < ActiveRecord::Base
end

# Usage
Event.create(payload: { kind: "user_renamed", change: ["jack", "john"]})

event = Event.first
event.payload # => {"kind"=>"user_renamed", "change"=>["jack", "john"]}

## Query based on JSON document
# The -> operator returns the original JSON type (which might be an object), whereas ->> returns text
Event.where("payload->>'kind' = ?", "user_renamed")

Итак, вы должны попробовать Record.where("data ->> 'status' = 200 ") или оператор, который соответствует вашему запросу (http://www.postgresql.org/docs/current/static/functions-json.html).