Rails OR查询与postgres数组

use*_*314 1 arrays postgresql ruby-on-rails

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

scope :with_tag, ->(tag) { where("tags @> ARRAY[?]", tag) }
Run Code Online (Sandbox Code Playgroud)

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

Post.with_tags(['some', 'tags', 'to', 'query'])
Run Code Online (Sandbox Code Playgroud)

哪个会返回任何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
Run Code Online (Sandbox Code Playgroud)

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

我可以在OR查询范围内完成我所追求的内容吗?

Jiř*_*šil 9

我没有运行代码,但我认为&&运营商做了你想要的:

scope :with_tags, ->(tags) { where("tags && ARRAY[?]", tags) }
Run Code Online (Sandbox Code Playgroud)