3

という名前のテーブルにhstore列があります。usersproperties

where条件内の静的SQL文字列をaRel構文に変換するにはどうすればよいですか?

User.where("properties -> 'is_robber' = 'true'") #=> ...some users

私が試してみました:

ut = User.arel_table
condition = ut["properties -> 'is_robber'"].eq('true')
User.where(condition) #=> throws pg error

そして、それは間違ったSQLを生成します:

 SELECT "users".* FROM "users" WHERE "users"."properties -> 'is_robber'" = 'true'

私が必要なものと比較して:

SELECT "users".* FROM "users" WHERE "users".properties -> 'is_robber' = 'true'
4

2 に答える 2

14

独自の Arel::Nodes::InfixOperation を作成することで、Arel でこれを実現できます。

ut = Arel::Table.new(:user)
hstore_key = Arel::Nodes::InfixOperation.new("->", ut[:properties], 'is_robber')
User.where(hstore_key.eq('true'))

生産します:

SELECT "users".* FROM "users" WHERE "users"."properties" -> 'is_robber' = 'true'

中置記法について聞いたことがない場合は、ウィキペディアで適切な説明が得られます

中置記法は一般的な算術および論理式の記法であり、演算子は作用するオペランドの間に中置式で記述されます (例: 2 + 2)。接頭表記 ( + 2 2 など) や後置表記 ( 2 2 + など) ほどコンピューターで解析するのは簡単ではありませんが、親しみやすいため、多くのプログラミング言語で使用されています。

残念ながら、Arel のドキュメントはあまりなく、InfixOperation ノードのドキュメントもありません。Arel で特定の SQL 操作を実行する方法を探している場合、最善の策は、ソース コードのノード ディレクトリを調べることです。

于 2013-11-27T09:04:10.510 に答える
-2

activerecord-postgres-hstore gemを使用すると、次のことが可能になります。

class User < ActiveRecord::Base
  serialize :data, ActiveRecord::Coders::Hstore
end

User.where("data -> 'speed' = 'ludicrous'")

詳細:
* https://github.com/softa/activerecord-postgres-hstore
* http://railscasts.com/episodes/345-hstore

RailsCast Pro のエピソードには、スコープ、ゲッター、セッターを自動的に作成するための優れたサンプル コードがあります。

于 2012-10-11T13:29:54.277 に答える