7

Ich habe eine Rails 5-Anwendung mit einer PostgreSQL 9.6-Datenbank.Abfrage, ob Array-Spalte einen oder mehrere Werte enthält

Die Anwendung hat Report-Modell, mit einem department_ids Array-Feld, das in schema.rb definiert ist als:

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

Ich muss schreiben, um eine Abfrage, die Bericht Zeilen zurückgibt, wo die department_ids Spalte eine oder mehrere einer enthält gegebene Menge von department_ids.

Meine aktuelle Problemumgehung ist dies mit in Ruby zu tun:

department_ids = [2, 5] 

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

jedoch select verwendet, hat die Kehrseite der einen Array statt ActiveRecord::Relation Rückkehr, was bedeutet, ich brauche die gefilterten Ergebnisse zurück in ActiveRecord::Relation Objekte Hydrat .

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

Ich möchte diesen Schritt vermeiden, und alles in einer einzigen Abfrage behandeln.

Wie kann ich Abfrage wie diese mit Active Record schreiben?

+1

Warum Sie mit einem solchen Feld wollen haben? Vielleicht müssen Sie report_id in der Abteilung definieren oder eine Verknüpfung zu vielen vornehmen? – AntonTkachov

Antwort

5

So etwas sollte funktionieren:

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