web-dev-qa-db-ja.com

配列列に1つ以上の値が含まれているかどうかを照会します

Rails 5アプリケーション、PostgreSQL9.6データベースがあります。

アプリケーションにはReportモデルがあり、department_ids配列フィールドがあります。これはschema.rbで次のように定義されています。

t.integer "department_ids", default: [], array: true

department_ids列に特定のdepartment_idのセットが1つ以上含まれているレポート行を返すクエリを作成する必要があります。

私の現在の回避策は、Ruby with:

department_ids = [2, 5]

reports = Report.all.select do |report|
  (report.department_ids & department_ids).any?
end

ただし、selectを使用すると、ActiveRecord::RelationではなくArrayが返されるという欠点があります。つまり、フィルタリングされた結果をActiveRecord::Relationオブジェクトにハイドレイトする必要があります。

Report.where(id: reports.map(&:id))

そのステップを避け、これをすべて1つのクエリで処理したいと思います。

Active Recordでこのようなクエリを作成するにはどうすればよいですか?

11
tommarshall

このようなものが機能するはずです:

Report.where('department_ids @> ARRAY[?]::integer[]', [2, 5])
11
potashin