2016-05-18 85 views
3

Rails 5 rc1でアプリケーションを作成しています。Rails 5は、mysql 5.7 jsonデータ型をサポートしています。Mysql 5.7 jsonのデータ型、Rails 5のactiverecordを使用したクエリ

+---------------------------+ 
| external     | 
+---------------------------+ 
| {"id": 10, "type": "mos"} | 
+---------------------------+ 

特定の「ID」と、外部列の「タイプ」を検索するには、私は、MySQLで次のクエリを使用:

add_column :organizations, :external, :json 

は、以下のように、この列の値であると仮定します

select external from organizations where JSON_CONTAINS(external,'{"id": 10, "type": "mos"}') ; 

今、レールを使用して同じクエリを作成する方法を知りたいと思います。 次は動作しません:

Organization.where("JSON_CONTAINS(external,'{"id": 10, "type": "mos"}')") 

注:それはクエリの一部であるように私はJSONテキストの前後に引用符を削除することはできません。

答えて

0

今のところactiverecordで解決策が見つかりませんでした。代替クエリ方法は次のとおりです。

type = "mos" 
id = 10 

organization = Organization.find_by_sql(["select * from organizations where JSON_CONTAINS(external_ref ,'{\"id\": ?, \"type\": \"#{ActiveRecord::Base::sanitize(type).remove("'")}\"}')", id]).first 

アクティブレコードクエリインターフェイスを使用するソリューションがある場合は、更新します。

2

find_by_sqlを使用せずに、ActiveRecordのwhereメソッドとバインド変数を引き続き活用できます。このよう

Organization.where("external->'$.id' = :id and external->'$.type' = :type", id: 10, type: "mos") 
+0

これはpostgresqlにのみ適用され、mysqlでは適用されません。 –

0

id_field = '$."id"' 
type_field = '$."type"'  
Organization.where("JSON_UNQUOTE(json_extract(external, '#{id_field}')) = ? AND JSON_UNQUOTE(json_extract(external, '#{type_field}')) = ?", 10, "mos") 
0

MYSQLを使用すると、フィールドに保存されているJSONオブジェクトから値を引っ張ってJSON_EXTRACTを使用することができます。あなたのケースでは、使用してみてください...

Organization.where("JSON_EXTRACT(external, '$.id') = 10 AND JSON_EXTRACT(external, '$.type') = 'mos'") 

とちょうど蹴りのために、擬似コードで...

<Class>.where("JSON_EXTRACT(<column_header>, '$.<object key>') <comparison operator> <object value>") 

書くためのきれいな方法があるかもしれませんが、これは仕事は、成し遂げるべきですそれ:

関連する問題