2013-04-03 3 views
1

Знает ли кто-нибудь, возможно ли иметь массив hstore в рельсах 4? я tryied сRails Postgresql массив hstore

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

, но я получил

PG::Error: ERROR: malformed array literal: 

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

ответ

0

Вы можете подать в суд на ActiveRecord-Postgres-hstore перл:

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

С документы:

  1. Создать hstore спинками поле:

    класс Person < ActiveRecord :: Base сериализации: данные, ActiveRecord :: Кодеры :: Hstore конец

  2. Добавление полей к нему:

    человек = Person.new person.data [ 'Foo'] = 'бар' person.save

  3. Query это:

    Perosn.where ("данные -> 'Foo' = 'бар'")

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

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

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

+1

Я пытался сделать массив HSTORE здесь. С классическим столбцом Hstore у меня нет проблем – Piotr

3

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

+0

Я не уверен, что это та же проблема. По крайней мере, мне удалось исправить эту ошибку, используя этот другой патч: https://github.com/rails/rails/pull/11477 – Ashitaka

2

Это ошибка, которая существует по крайней мере в Rails 4.0.1.

A pull request was proposed to fix it, но пока он не слился вы можете обезьяны патч Rails:

# 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 

Sidenote, у меня были проблемы тестирования этого в консоли Rails, потому что инициализатор не получал загружен там. Вы можете сделать это с помощью:

load "#{Rails.root}/config/initializers/extensions/postgres.rb" 
+0

Ошибка все еще присутствует в Rails 4.0.2. Надеюсь, они скоро сгущут! – panmari

Смежные вопросы