使用ActiveRecord匹配记录中的数组

时间:2016-03-20 04:02:22

标签: arrays ruby postgresql activerecord rails-activerecord

我的表的一列由json格式的字符串数组组成。我想知道如何使用ActiveRecord返回所有记录,这些记录的数组匹配或由提供的数组中的相同项组成。

例如:

flag.colors = ['red', 'blue', 'green']
query = ['blue', 'red', 'green']

Flag.where('colors matches query') #=> flag

1 个答案:

答案 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