假设我有一个Book模型,它的category属性是一个数组。我想创建一个范围,在其中我可以从要传递的另一个数组中获取所有包含至少一项的书籍。
经过广泛的搜索并尝试了许多不同的查询之后,我发现的最接近的是:
Book.where("'Mystery' = ANY(categories)")
如何将“神秘”替换为类似的东西,['Categ1', 'Categ2', etc...]
以便可以检索包含数组中至少一个值的任何Book?
您需要了解三件事:
&&
。array1 && array2
如果两个数组具有相同的元素,则为true。array[v1, v2, v3]
。?
逗号分隔的列表替换该占位符,以便在到达数据库时where('c = any(array[?])', [1,2,3])
看起来像c = any(array[1,2,3])
它。如果将所有这些放在一起,就会得到如下信息:
categories = %w[Categ1 Categ2 Categ3]
Book.where('categories && array[?]', categories)
您的范围将是这样的:
scope :with_any_categories, ->(cats) { where('categories && array[?]', cats) }
也许:
scope :with_any_categories, ->(*cats) { where('categories && array[?]', cats.flatten) }
取决于您要如何使用示波器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句