2009-09-01 16 views
1

Ich habe eine Standard-Master-Detail-Beziehung zwischen zwei Modellen in einer RoR-Anwendung. Die Detaildatensätze enthalten vier boolesche Felder, die die Anwesenheit/Abwesenheit von etwas anzeigen.Boolesche Werte unter Schienen zählen

Wenn ich die Detaildatensätze anzeigen möchte ich eine Zusammenfassung hinzufügen, die die Anzahl der Datensätze angibt, deren boolescher Wert für jedes der vier booleschen Felder auf True gesetzt ist. Beispiel: Datum | Boolesches Feld 1 | Boolesches Feld 2 | usw. 2009/08/29 | T | T | 2009/08/30 | T | F | 2009/08/31 | F | T | 2009/09/01 | F | T |

Gesamt: 4 2 3

Ich habe versucht, so etwas wie @ entries.count mit ([ "Boolean Feld 1", true]) So wie ich es sehe, gibt es zwei Möglichkeiten, um diese Werte zu berechnen: einen am Modell durch Ausführen einer SQL-Abfrage (hässlich) oder auf der Ansichtsebene mithilfe eines Zählers (hässlich wieder). Gibt es einen anderen Weg, um das zu erreichen, was ich will?

Vielen Dank für Ihre Zeit,

Angelos Arampatzis

Antwort

5

@entries.select {|r| r.bool_field1}.size 
+0

'@ entries.select (&: bool_field1) .size' eher – dimus

1

SQL nicht so hässlich sein kann, ist, wie es Schienen macht zu sein, und es ist ziemlich effizient, machen nur es ein named_scope und Ihr Controller/Ansicht wird immer noch schön aussehen

4

Sie können entweder:

@entries.count(:conditions => { :boolean_field_1 => true }) 

Sie können ziemlich bis diese durch eine benannte Umfang tun:

named_scope :booleans, :conditions => { :boolean_field_1 => true }) 

und dann

@entries.booleans.count 

Oder wenn Sie bereits alle Elemente in einem Array haben (und nicht wenige Auserwählte) und will nicht die Datenbank schlagen ...

Rails bietet ein? Methode für alle Spalten. So, während Sie haben:

@entry.boolean_field 

Sie haben auch:

@entry.boolean_field? 

So können Sie dies tun:

@entries.collect(&:boolean_field?).length 
+0

Dies sollte die ausgewählte Antwort sein! Vielen Dank –