我的表的一列由json格式的字符串数组组成。我想知道如何使用ActiveRecord返回所有记录,这些记录的数组匹配或由提供的数组中的相同项组成。
例如:
flag.colors = ['red', 'blue', 'green']
query = ['blue', 'red', 'green']
Flag.where('colors matches query') #=> flag
答案 0 :(得分:2)
在SQL部分上使用ActiveRecord搜索序列化数据是不可能的。你可以在Ruby端过滤它:
flag.colors = ['red', 'blue', 'green']
query = ['blue', 'red', 'green']
Flag.all.select{|f| f.colors.sort == query.sort} #=> [flag]
当你使用PostgreSQL时,实际上有更好的方法。 PG支持本机阵列。您可以在迁移中启用它:
create_table :flags do |t|
t.text :tags, array: true
end
然后只需搜索它:
query = ['blue', 'red', 'green']
#With Overlap operator:
Flag.where.overlap(tags: query)
#or with Contains Operator
Flag.where.contains(tags: query)
您可以找到更多详情here。