Rails 3.1, Postgres 9.1.4, неизвестная ошибка оператора
Я пытаюсь добавить столбец данных hstore к существующей модели STI.
Аналогично ошибкам Postgres HStore - неизвестный оператор, но, насколько я могу судить, я установил расширение hstore. Я удалил базу данных и пересобрал ее из миграции без ошибок, но спецификации все еще не работают.
Mac OS X 10.8.2
Rails 3.1.10
psql (PostgreSQL) 9.1.4
user.rb
has_many :targets
def complete_targets
targets.where("data @> (:key => :value)", key: 'complete', value: 'true')
end
targets.rb
belongs_to :user
serialize :data, ActiveRecord::Coders::Hstore
Миграция setup_hstore:
class SetupHstore < ActiveRecord::Migration
def self.up
execute "CREATE EXTENSION IF NOT EXISTS hstore"
end
def self.down
execute "DROP EXTENSION IF EXISTS hstore"
end
end
Добавить миграцию столбца данных:
class AddDataToRecords < ActiveRecord::Migration
def change
add_column :records, :data, :hstore
end
end
Добавьте индексы миграции:
class AddHstoreIndexes < ActiveRecord::Migration
def up
execute "CREATE INDEX records_gin_data ON records USING GIN(data)"
end
def down
execute "DROP INDEX records_gin_data"
end
end
Ошибка:
ActiveRecord::StatementInvalid:
PG::Error: ERROR: operator does not exist: unknown => unknown
LINE 1: ...records"."user_id" = 244 AND (data @> ('complete' => 'true')...
Вывод Navicat при попытке создать расширение с помощью прямого запроса:
CREATE EXTENSION hstore Error : ERROR: extension "hstore" already exists
1 ответ
Решение
Может быть, это простая проблема с типом данных в вашем случае, попробуйте:
data @> ('complete'::text => 'true'::text)
Но =>
оператор устарел (и был удален в 9.2), лучше использовать hstore()
формат:
(data @> hstore('complete','true'))