2016-11-17 3 views
3

In meinem Modell Room habe ich ein Attribut mit dem Namen available_days, das als Array gespeichert wird.Suchen Sie Datensätze, bei denen die Länge des Arrays gleich ist - Rails 4

Zum Beispiel:

Room.first.available_days 
=> ["wed", "thurs", "fri"] 

Was ist der beste Weg, um alle Räume, in denen die Größe des Arrays finden gleich 3 ist?

Ich habe versucht, so etwas wie

Room.where('LENGTH(available_days) = ?', 3) 

ohne Erfolg.

Update: der Datentyp für available_days ist eine Zeichenfolge, sondern um ein Array zu speichern, ich bin Serialisierung das Attribut aus meinem Modell:

app/models/room.rb

serialize :available_days 
+0

Können Sie das Schema ändern? Die Verwendung von 'serialize' ist fast immer ein schrecklicher Fehler, beginnt schnell und einfach und explodiert dann in deinem Gesicht. –

Antwort

0

Ich kann nicht an eine reine sql Weise denken, es für sqlite zu tun, da available_days eine string ist.

Aber hier ist eine Möglichkeit, es zu tun, ohne alle Datensätze gleichzeitig zu laden.

rooms = [] 
Room.in_batches(of: 10).each_record do |r| 
    rooms << r if r.available_days.length == 3 
end 

p rooms 
+0

Danke für die Hilfe. Eine Ausnahme bekommen: 'keine solche Funktion: Kardinalität' @Rashmirathi – Kathan

+0

@Kathan Welche Datenbank verwendest du? Ich nahm an, dass Sie Postgres verwenden. Was ist der Datentyp von 'available_days'? – Rashmirathi

+0

Sqlite3 für dev. Und 'available_days' ist eine Zeichenkette, aber ich serialisiere sie, um ein Array zu speichern. @Rashmirathi – Kathan

Verwandte Themen