2

Railsアプリ(v 3.2.6)にSqueel gem(Arelベース)を使用したいと思います。私のhstore列はプロパティと呼ばれます。

これらは完全に正常に機能します。

User.where{(firstname == 'Ryan') & (lastname == 'Bates')}
User.where{"properties @> ('male' => '1')"}

Squeelはhstore関数をサポートしていないようであるため、2番目の例は単純なPostgresクエリです。

これらは機能しません:

User.where{"properties @> ('male' => '1')" & firstname == 'Ryan'}
User.where{("properties @> ('male' => '1')") & (firstname == 'Ryan')}

エラー:

NoMethodError: undefined method `&' for "properties @> ('male' => '1')":String

エラーは理解できますが、hstoreクエリをカプセル化する方法がわかりません。SqueelまたはArelを使用してhstoreクエリを作成するためのより良い方法はありますか?

4

3 に答える 3

1

続編のhstoregemを使用してみてください。これにより、hStoreのサポートが続編に追加されます。

于 2012-09-05T19:06:46.607 に答える
1

Squeelは、バッククォート( `)を使用してSQLリテラルをサポートします。

次のようなものが機能する可能性があります。

Person.where{(id == my{@person.id}) & (`preferences @> send_me_junk_email=>yes`)}

バックティックを使用する場合、Squeelは抽象化レイヤーをドロップダウンし、SQLを直接実行します。

http://erniemiller.org/2012/05/30/sql-literals-in-squeel-or-overriding-backticks-in-ruby/

于 2012-10-21T21:17:44.213 に答える
1

私はこれを掘り下げました。答えはこのファイルにあるようです。基本的に、ここに独自の操作を追加できます。

この例では@>、PostgreSQL配列をハントするために使用します(このプレゼンテーションで示されています)。

module Squeel
  module Nodes
    module Operators
      def within *list
        list = "{#{list.map(&:to_s).join(',')}}"
        Operation.new self, :'@>', list
      end
    end
  end
end

このモンキーパッチを挿入すると、配列フィールドNoteを持つモデルがあると仮定して、次のSqueelステートメントが可能になります。tags

Note.where { tags.within 'first tag', 'second tag' }

これにより、次のようなSQLが生成されます。

"SELECT \"notes\".* FROM \"notes\"  WHERE \"notes\".\"tags\" @> '{first tag,second tag}'"
于 2014-01-03T21:16:15.127 に答える