Rails Postgresql массив hstore

Кто-нибудь знает, возможно ли иметь массив hstore в rails 4? я пытался с

add_column :orders, :frozen_content, :hstore , array: true

но я получил

 PG::Error: ERROR:  malformed array literal: 

когда я пытаюсь сохранить


person Piotr    schedule 03.04.2013    source источник


Ответы (3)


В принципе, да, но, как вы обнаружили, при сохранении он не экранируется правильно. Я только сегодня зарегистрировал проблему по этому поводу, см. https://github.com/rails/rails/issues/11135 (включает исправление и некоторый демонстрационный код)

person inopinatus    schedule 27.06.2013
comment
Я не уверен, что это та же проблема. По крайней мере, мне удалось исправить эту ошибку с помощью другого патча: github.com/rails/rails/ тянуть/11477 - person Ashitaka; 30.11.2013

Это ошибка, которая существует по крайней мере в 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"
person Ashitaka    schedule 30.11.2013
comment
Ошибка все еще присутствует в Rails 4.0.2. Надеюсь, они скоро объединятся! - person panmari; 08.01.2014

Вы можете подать в суд на гем activerecord-postgres-hstore:

https://github.com/engageis/activerecord-postgres-hstore

Из документов:

  1. Создайте поле с поддержкой hstore:

    class Person ‹ ActiveRecord::Base сериализовать :data, ActiveRecord::Coders::Hstore end

  2. Добавьте к нему поля:

    person = Person.new person.data['foo'] = 'bar' person.save

  3. Запросите это:

    Perosn.where("данные -> 'foo' = 'bar'")

Railscast #345 (за платным доступом) более подробно описывает использование hstore, используя гем activerecord-postgres-hstore:

http://railscasts.com/episodes/345-hstore

Примечание. Я не пробовал это с рельсами 4... YMMV.

person Brian Tol    schedule 17.04.2013
comment
Я пытался сделать HSTORE Array здесь. С классической колонкой Hstore у меня нет проблем - person Piotr; 19.04.2013