Кто-нибудь знает, возможно ли иметь массив hstore в rails 4? я пытался с
add_column :orders, :frozen_content, :hstore , array: true
но я получил
PG::Error: ERROR: malformed array literal:
когда я пытаюсь сохранить
Кто-нибудь знает, возможно ли иметь массив hstore в rails 4? я пытался с
add_column :orders, :frozen_content, :hstore , array: true
но я получил
PG::Error: ERROR: malformed array literal:
когда я пытаюсь сохранить
В принципе, да, но, как вы обнаружили, при сохранении он не экранируется правильно. Я только сегодня зарегистрировал проблему по этому поводу, см. https://github.com/rails/rails/issues/11135 (включает исправление и некоторый демонстрационный код)
Это ошибка, которая существует по крайней мере в Rails 4.0.1.
Был предложен пул-реквест, чтобы исправить это, но пока он не будет объединен, вы можете пропатчить Рельсы:
# config/initializers/extensions/postgres.rb
module ActiveRecord
module ConnectionAdapters
class PostgreSQLColumn < Column
module Cast
private
def quote_and_escape(value)
case value
when "NULL"
value
else
"\"#{value.gsub(/(["\\])/, '\\\\\1')}\""
end
end
end
end
end
end
Кстати, у меня возникли проблемы с тестированием этого в консоли Rails, потому что там не загружался инициализатор. Вы можете сделать это с помощью:
load "#{Rails.root}/config/initializers/extensions/postgres.rb"
Вы можете подать в суд на гем activerecord-postgres-hstore:
https://github.com/engageis/activerecord-postgres-hstore
Из документов:
Создайте поле с поддержкой hstore:
class Person ‹ ActiveRecord::Base сериализовать :data, ActiveRecord::Coders::Hstore end
Добавьте к нему поля:
person = Person.new person.data['foo'] = 'bar' person.save
Запросите это:
Perosn.where("данные -> 'foo' = 'bar'")
Railscast #345 (за платным доступом) более подробно описывает использование hstore, используя гем activerecord-postgres-hstore:
http://railscasts.com/episodes/345-hstore
Примечание. Я не пробовал это с рельсами 4... YMMV.