使用 where 数组子句在 rails 中查询

Query in rails with where array clause

我有一个数组字段,author_ids在书上table,我需要写一个查询来查找数组数据。

我有什么办法可以得到,即使它的值是 author_ids has [1,3],但是当我检查 array [1,5] 时,我仍然可以得到数据,因为它有 1 个共同点?这里('author_ids @> ARRAY[?]::integer[]',[1,5])

where('author_ids @> ARRAY[?]::integer[]',[1,5])

这不是 return 数据,where('author_ids @> ARRAY[?]::integer[]',[1,3]) 是因为它有 [1,3]。我想获取数据 where [auther_ids] ? any [passed_aray]

TL;DR

Postgres documentation

问题

anyarray @> anyarray → boolean

Does the first array contain the second, that is, does each element appearing in the second array equal some element of the first array? (Duplicates are not treated specially, thus ARRAY[2] and ARRAY[1,1] are each considered to contain the other.)

ARRAY[1,4,3] @> ARRAY[3,1,3] → t

这意味着如果您有 [1,3,7,9] 对应 authors_ids 并且您使用 [1, 5] 查询它不会 return 任何东西。为什么?

@> 检查您的查询数组是否是该列的子集并且 [1,5] 不是 [1,3,7,9] 的子集,因为缺少 5。

解决方案

您需要的运算符是&&:

anyarray && anyarray → boolean

Do the arrays overlap, that is, have any elements in common?

ARRAY[1,4,3] && ARRAY[2,1] → t

使用它您的查询如下:

where('author_ids && ARRAY[?]::integer[]',[1,5])

重构

我认为正确的做法是在作者 class 的模型上使用 has_many 关联。

class CurrentModel < ApplicationRecord
  has_many :authors
end

然后您的查询如下:

joins(:authors).where(authors: { id: [1,5] }