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でこのようなクエリを作成するにはどうすればよいですか?
このようなものが機能するはずです:
Report.where('department_ids @> ARRAY[?]::integer[]', [2, 5])