簡體   English   中英

Mysql 5.7 json數據類型,在Rails 5中使用activerecord查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM