繁体   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