1

Railsアプリのhstore列にスコープを作成しようとしています。製品はモデルであり、機能はタイプhstoreの属性です(Postgresql 9.2を使用)。スコープを持つ私のクラスは以下に定義されています:

class Product < ActiveRecord::Base
    scope :with_features, lambda {|features| where("foo_id in (?)", features)

上記のスコープは、単一の値を機能として渡す場合にのみ機能します。配列はエラーをスローします。これを以下に示します。

Product.with_features('api')
  => [#<Product id: 1, name: "Sample">] 
     # so great success

# now with an array
Product.with_features(['api','mobile'])
  => ActiveRecord::StatementInvalid: PG::Error: ERROR:  argument of WHERE must be type boolean, not type record 
    # so no good, this query will work as usual if features isn't of type hstore

Rails 3.2では、配列が関係している場合、postgres hstoreタイプのサポートが制限されているようです(私はhttps://github.com/softa/activerecord-postgres-hstoreを使用しています)。ANDクエリを一緒に追加するために、各ループでいくつかのソリューションを試してきましたが、あまり運がありません。何か案は?

4

1 に答える 1

0

これが私が思いついた、うまく機能する1つの解決策です。

scope :with_features, lambda { |features| 

  #store the composed scope in local variable to build on
  composed_scope = self.scoped

  # if array, then loop through each
  if features.instance_of?(Array)
    features.each do |feature|
      composed_scope = composed_scope.where("features ? :key", :key => feature)
    end

  # otherwise, it's a single string parameter, parse as normal
  else
    composed_scope = composed_scope.where("features ? :key", :key => features)
  end

  # return the newly built composed scope
  composed_scope
}

上記のクエリの例は両方とも、期待される結果を返します。

于 2012-09-29T23:42:13.223 に答える