7

Tôi có ứng dụng Rails 5, với cơ sở dữ liệu PostgreSQL 9.6.Truy vấn nếu cột mảng chứa một hoặc nhiều giá trị

Ứng dụng này có Report mô hình, với một lĩnh vực department_ids mảng, được định nghĩa trong schema.rb như:

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

tôi cần phải viết một truy vấn mà trả về dòng báo cáo nơi cột department_ids chứa một hoặc nhiều hơn một tập hợp các bộ phận.

workaround hiện tại của tôi là để làm điều này trong Ruby với:

department_ids = [2, 5] 

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

Tuy nhiên, sử dụng select có nhược điểm của trả lại một Array thay vì ActiveRecord::Relation, có nghĩa là tôi cần phải làm ẩm kết quả lọc trở lại vào ActiveRecord::Relation đối tượng .

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

Tôi muốn tránh bước đó và xử lý tất cả trong một truy vấn.

Tôi làm cách nào để có thể viết truy vấn như thế này bằng Bản ghi đang hoạt động?

+1

Tại sao bạn đã muốn với lĩnh vực như vậy? Có lẽ bạn cần phải xác định report_id trong bộ phận hoặc làm cho một hiệp hội nhiều đến nhiều? – AntonTkachov

Trả lời

5

Something như thế này nên làm việc:

Report.where('department_ids @> ARRAY[?]::integer[]', [2, 5]) 
Các vấn đề liên quan