7

我正在使用 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 文本周围的引号,因为它是查询的一部分。

4

4 回答 4

12

您仍然可以利用 ActiveRecord 的 where 方法和绑定变量,而无需借助 find_by_sql。

Organization.where("external->'$.id' = :id and external->'$.type' = :type", id: 10, type: "mos")
于 2016-07-11T04:58:27.957 回答
5

使用 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>")

这应该可以完成工作,尽管可能有更漂亮的方式来编写它:)

于 2017-06-29T22:22:52.200 回答
1

像这样:

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")
于 2016-11-08T09:55:49.910 回答
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

一旦有带有activerecord查询接口的解决方案,我会更新。

于 2016-05-31T17:56:26.023 回答