Ни один оператор не соответствует заданному имени и типу(ам) аргумента.

Я настроил свое приложение Rails 3.2.x для использования PostgreSQL HStore, но получаю сообщение об ошибке. Похоже, что расширение hstore не было воспринято средой. Я уже перезагрузил свою машину, проверил расширения базы данных и т. д.

Когда я пытаюсь выполнить:

User.where("settings @> (:key => :value)", :key => "setting_x", :value => "test")

Я получаю сообщение об ошибке: (@> не опознано, т. е. расширение hstore не установлено?)

HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Моя настройка приложения Rails:

Gemfile.rb:

gem 'activerecord-postgres-hstore'

Миграция:

add_column :users, :settings, :hstore
execute "CREATE INDEX CONCURRENTLY users_gin_settings ON users USING GIN(settings)"
# can see the extenstion installed on my local dev psql database after this

User модель:

serialize :settings, ActiveRecord::Coders::Hstore

Динамические User методы:

# metaprogramming: has_setting_x + instance.setting_x
%w[setting_x setting_y setting_z].each do |key|
attr_accessible key
    # doesn't work > throws error because of the @> operator
    scope "has_#{key}", lambda { |value| where("settings @> (? => ?)", key, value) }

    # works: can use instance.setting_x
    define_method(key) do
      settings && settings[key]
    end

    # works: can use instance.setting_x = "value"
    define_method("#{key}=") do |value|
      self.settings = (settings || {}).merge(key => value)
    end
end

Обновление 1:

Это работает, когда я обращаюсь напрямую к БД PostgreSQL:

SELECT "users".* FROM "users" WHERE (settings @> hstore('setting_x','6D9Q7RO4SVWHXK86F'));

В документах Hstore говорится:

The => operator is deprecated and may be removed in a future release. Use the hstore(text, text) function instead.

Итак, судя по всему, в моей версии базы данных PostgreSQL (9.2.1) нотация => уже объявлена ​​устаревшей. Похоже, мне предстоит больше исследований.


person Webdevotion    schedule 05.02.2013    source источник
comment
Не добавляйте Решение: к вашему вопросу. Добавьте ответ, и когда истечет время переполнения стека, вы сможете принять свой ответ.   -  person the Tin Man    schedule 05.02.2013
comment
@ Шон Да, тоже пробовал эту запись.   -  person Webdevotion    schedule 05.02.2013
comment
+1 Правки и вопрос теперь намного лучше. Stack Overflow любит статьи в стиле Википедии, поэтому пишите четко, лаконично и полными предложениями. Вы заметите, что мое редактирование удалило некоторые сокращения и улучшило грамматику.   -  person the Tin Man    schedule 05.02.2013


Ответы (1)


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

Оператор => устарел и может быть удален в будущем выпуске. Вместо этого используйте функцию hstore(text, text).

Так что, судя по всему, в моей версии базы данных PG (9.2.1) уже устарела нотация =>.
Теперь работает как локально, так и на Heroku.

Пример:

User.where("settings @> hstore(?,?)", "setting_x", key)
person Webdevotion    schedule 05.02.2013