2016-10-26 1 views
1

Я пытаюсь вставить рубиновый хеш в столбце Postgres JSON. В основном это набор хешей в массиве. Таким образом, у вас есть структура что-то вроде:Ruby with PostgreSQL - Вставка в поле JSON базы данных

[{"a":"1"},{"b":"2"},{"c":"3"}] #the length goes on 

Существующий код, что я пытаюсь сделать, это:

require 'pg' 

freq = 0.05 
$test = 0 
$sinval = 0 
arr = Array.new 

@conn = PG.connect(
     :dbname => 'test_db', 
     :user => 'abc', 
     :port => 6100, 
     :host => 'localhost' 
     ) 

while true do 
     $test = ($test+freq).round(2) 
     $sinval = Math.sin($test*(Math::PI/180)).round(6) 
     hash = {:value=>$sinval.to_s} 
     arr.push(hash.to_json) 
     if(arr.length>=1800) 
       @conn.exec("INSERT INTO sinewave(data) VALUES('#{arr}');") 
       arr = Array.new 
     end 
end 

Но сейчас, я не в состоянии хранить в базе данных как я хочу. Для каждой строки, что я хотел бы видеть это JSON массив из 1800 объектов, и структура будет:

[{"a":"1"},{"b":"2"},{"c":"3"}] 

Я не знаю, что случилось. Может быть hash = {:value=>$sinval.to_s} Данная строка неправильная. Другие способы разобраться в этом?

+0

какая ошибка вы получаете? –

+0

Я не получал ошибок! все отлично. однако данные, хранящиеся в базе данных, представляют собой нечто вроде формы «[" {\ "value \": \ "- 0.000873 \"} "," {\ "value \": \ "- 0.001745 \"} "," {\ "value \": \ "- 0.002618 \"} "," {\ "value \": \ "- 0.003491 \"} "," {\ "value \": \ "- 0.004363 \"} ", "{\" value \ ": \" - 0.005236 \ "}", "{\" value \ ": \" - 0.006109 \ "}", "{\" value \ ": \" - 0.006981 \ "}" ] – Pragun

+0

может кто-нибудь сказать мне, как вы используете html_safe из rails в ruby? – Pragun

ответ

1

Если вы конвертируете хэш-объект в JSON в ruby, он автоматически добавляет escape-символ, поэтому попробуйте преобразовать весь массив объекта в JSON вместо хеш-объекта.

require 'pg' 

freq = 0.05 
$test = 0 
$sinval = 0 
arr = Array.new 

@conn = PG.connect(
     :dbname => 'test_db', 
     :user => 'abc', 
     :port => 6100, 
     :host => 'localhost' 
     ) 

while true do 
     $test = ($test+freq).round(2) 
     $sinval = Math.sin($test*(Math::PI/180)).round(6) 
     hash = {:value=>$sinval.to_s} 
     arr.push(hash) 
     if(arr.length>=1800) 
       @conn.exec("INSERT INTO sinewave(data) VALUES('#{arr.to_json}');") 
       arr = Array.new 
     end 
end 
2

Postgres сохраняет тип JSON как строку JSON. Это строка, которую вы можете получить, позвонив по #to_json на большинство объектов в рубине. Вот ссылка на то, как postgres имеют дело с типом JSON более подробно.

https://www.postgresql.org/docs/9.6/static/datatype-json.html

Потому что он сохраняется в виде строки JSON, все цитаты будут экранированы. Вот почему-то вроде этого

{ a: 1 } 

станет это

"{\"a\":1}" 

\ для побега цитату так, чтобы это не конец строки.

Когда вы извлекаете его из postgres (я лично никогда не использовал тип JSON в PG, но я считаю, что он работает аналогично JSON.parse на этой строке), вы больше не увидите косых черт. И вышеупомянутый процесс выполняется postgres.

+0

. Сохранение вещей с помощью escape-цитаты в базе данных не кажется хорошей практикой. Спасибо, хотя :) привет! – Pragun

+0

@ Прагун, который делается автоматически по postgres. –