Rails 3.2 と Postgres hstore を使用してアプリケーションを構築しているときに、非 ActiveRecord モデルの問題に遭遇しました (現時点では ActiveAttr を使用していますが、他のオプションも使用できます)。つまり、データベースにクエリを実行して、hstore 内の一連のキーを取得する必要があります。私が知る限り、これは ActiveRecord::Query ではない直接的なステートメントを介してのみ可能です。
私の現在のコードは次のようになります。
def self.keys(query)
# FIXME Need to determine how to sanitize input
sql = "SELECT DISTINCT key FROM ( SELECT skeys(data) AS key from \"products\" ) AS keys"
if(query && !query.empty?)
sql += " WHERE lower(key) LIKE '%#{query.downcase}%'"
end
ActiveRecord::Base.connection.select_values(sql)
end
これは機能しますが、入力をサニタイズしませんquery
。代わりに配列を作成してキー行をsql += " WHERE lower(key) LIKE ?"
に変更しようとすると、ログに次のエラーが記録されます。
Could not log "sql.active_record" event. NoMethodError: undefined method `squeeze' for #<Array:0x007fd9968704e8>
TypeError: wrong argument type Array (expected String): ["SELECT DISTINCT key FROM ( SELECT skeys(data) AS key from \"products\" ) AS keys WHERE lower(key) LIKE ?", "%o%"]
適切なサニタイズ メソッドを外部から呼び出すこと、または少なくともモデルで同じロジックを実行することは可能ですか?