Rails OR查询与postgres数组

时间:2014-12-31 17:52:48

标签: ruby-on-rails arrays postgresql

我使用postgres的数组数据类型在rails中有一个标记系统。我正在尝试编写一个scope,它将返回包含标记的所有帖子。到目前为止,我有这个范围工作:

scope :with_tag, ->(tag) { where("tags @> ARRAY[?]", tag) }

我想扩展这个范围,以便我可以同时查询多个标签,理想情况如下:

Post.with_tags(['some', 'tags', 'to', 'query'])

哪个会返回包含其中一个标记的Post。我已经考虑过创建一个类方法来处理迭代输入数组:

def self.with_tags(args)
  # start with empty activerecord relation
  # want to output AR relation
  results = Post.none
  args.each do |tag|
    results = results.concat(Post.with_tag(tag))
  end
  results.flatten
end

但这种方法对我来说很有趣,因为它为每个参数创建了一个新查询。由于flatten,它也不会返回ActiveRecord :: Relation,我真的希望将其作为输出。

我可以使用OR查询完成我在追踪范围内的操作吗?

2 个答案:

答案 0 :(得分:7)

我没有运行代码,但我认为&&运算符可以执行您想要的操作:

scope :with_tags, ->(tags) { where("tags && ARRAY[?]", tags) }

答案 1 :(得分:-1)

这将为您提供帮助。

 intersection = Post.all.map do |i|
                    i.tags & [ "Your" ,"array"]
                 end