我使用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
查询完成我在追踪范围内的操作吗?
答案 0 :(得分:7)
我没有运行代码,但我认为&&
运算符可以执行您想要的操作:
scope :with_tags, ->(tags) { where("tags && ARRAY[?]", tags) }
答案 1 :(得分:-1)
这将为您提供帮助。
intersection = Post.all.map do |i|
i.tags & [ "Your" ,"array"]
end