[英]Mysql 5.7 json datatype, query with activerecord in Rails 5
我正在使用Rails 5 rc1進行應用程序。 Rails 5支持mysql 5.7 json數據類型。
add_column :organizations, :external, :json
假設此列中的值如下:
+---------------------------+
| external |
+---------------------------+
| {"id": 10, "type": "mos"} |
+---------------------------+
要在外部列中搜索特定的“id”和“type”,我在mysql中使用以下查詢:
select external from organizations where JSON_CONTAINS(external,'{"id": 10, "type": "mos"}') ;
現在,我想知道,如何使用rails進行相同的查詢。 以下不起作用:
Organization.where("JSON_CONTAINS(external,'{"id": 10, "type": "mos"}')")
注意:我無法刪除json文本周圍的引號,因為它是查詢的一部分。
您仍然可以利用ActiveRecord的where方法和綁定變量,而無需使用find_by_sql。
Organization.where("external->'$.id' = :id and external->'$.type' = :type", id: 10, type: "mos")
使用MYSQL,您可以使用JSON_EXTRACT
從存儲在字段中的JSON對象中提取值。 在你的情況下,嘗試使用...
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>")
這應該完成工作,雖然可能有一個更漂亮的方式來寫:)
到目前為止,我沒有通過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
一旦有一個帶有activerecord查詢界面的解決方案,我會更新。
像這樣:
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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.