1

Rails3.2.xアプリをPostgreSQLHStoreを使用するように設定しましたが、エラーが発生します。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:

これは、PostgreSQLDBと直接通信するときに機能します。

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)はすでにこの=>表記法を廃止しています。まだまだ研究があるようです。

4

1 に答える 1

7

PostgreSQLドキュメントから:

=>演算子は非推奨であり、将来のリリースで削除される可能性があります。hstore(text, text)代わりに関数を使用してください。

そのため、見た目からすると、私のPGデータベースバージョン(9.2.1)はすでに=>表記法を廃止しています。
現在、ローカルとHerokuの両方で作業しています。

例:

User.where("settings @> hstore(?,?)", "setting_x", key)
于 2013-02-05T15:50:13.997 に答える