首页 > 解决方案 > 存储 UUID 数组的 Rails、MySql、JSON 列 - 需要完全匹配

问题描述

我有一个名为列表的模型,它有一个名为item_ids. item_ids是一个 JSON 列 (MySQL),该列包含 UUID 数组,每个都指向一个项目。

现在,当有人创建新列表时,我需要搜索是否存在具有相同 UUID 集的现有列表,并且我想使用查询本身进行此搜索以获得更快的响应。也尽可能使用 ActiveRecord 查询。

我如何实现这一目标?

item_ids = ["11E85378-CFE8-39F8-89DC-7086913CFD4B", "11E85354-304C-0664-9E81-0A281BE2CA42"]

v = List.new(item_ids: item_ids)
v.save!

现在,我如何检查是否存在与查询中提到的项目 id 完全匹配的列表?以下不会工作。

list_count = List.where(item_ids: item_ids).count

编辑 1

List.where("JSON_CONTAINS(item_ids, ?) ", item_ids.to_json).count

此语句有效,但即使只有一项匹配,它也会计数。寻找确切的项目数量。

编辑 2

List.where("JSON_CONTAINS( item_ids, ?) and JSON_LENGTH(item_ids) = ?", item_ids.to_json, item_ids.size).count

看起来这很有效

标签: mysqlruby-on-railsarraysjsonruby-on-rails-5

解决方案


您可以在列表和项目之间实现一个有很多关系,然后像这样访问。

List.includes(:item).where('items.id in (?)',item_ids)

要实现 has_many 关系:

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association


推荐阅读