2016-06-01 13 views
0

Ich versuche, Datensätze aus der Tabelle nach Hash-Wert zu erhalten. Hier ist Rekord Beispiel:Holen Sie Datensätze nach Hash-Wert

Activity:0x0000000709be18> { 
       :id => 1, 
     :trackable_id => 3, 
    :trackable_type => "User", 
      :owner_id => 1, 
     :owner_type => "User", 
       :key => "user.ban", 
     :parameters => { 
     :status => "new" 
    }, 
     :recipient_id => nil, 
    :recipient_type => nil, 
     :created_at => Wed, 01 Jun 2016 22:19:39 UTC +00:00, 
     :updated_at => Wed, 01 Jun 2016 22:19:39 UTC +00:00 
} 

Ich brauche alle Aktivitäten mit paremeters Status neu zu erhalten (Parameter [: status] == 'neuen').

Dieser Code funktioniert, aber ich muss ActiveRecord-Beziehung nicht ein Array zurückgeben.

Activity.select{|act| act.parameters == { status: 'new'}} 
+0

'Activity.where ('status =?', 'Neue')' –

+0

Parameter ist ein Hash und Status ist der Schlüssel dieser Hash –

+1

Welche Version von PostgreSQL verwenden Sie? Was ist der Typ der 'Parameter'-Spalte? – Raffael

Antwort

0

Es ist nicht leicht innerhalb eines serialisierten Feld zu suchen, aber Sie können LIKE mit einigen Einschränkungen verwenden.

Activity.where('parameters LIKE ?', '%status: new%')

Dies funktioniert, aber ich schlage vor, ein benutzerdefiniertes Feld hinzufügen, wie, was Besitzer öffentliche Tätigkeit gem erwähnt hat:

„Neben den wenigen Bereichen, die jede Aktivität hat, können Sie setzen Sie auch benutzerdefinierte Felder. Dies könnte sehr vorteilhaft sein, als Parameter sind eine serialisierten Hash, die nicht einfach aus der Datenbank abgefragt werden kann. "

+0

Aber Sie gehen davon aus, dass das Modell 'serialize' verwendet, um einige YAML in eine' text'-Spalte zu stopfen. PostgreSQL unterstützt JSON- und Hstore-Spalten, die Daten wie diese speichern und ohne das gesamte YAML-Rauschen abfragen können. –

+0

Oh mein schlechtes für Annahmen. Aber gemäß der Modellstruktur bin ich mir ziemlich sicher, dass er eine öffentliche Aktivität mit gem call verwendet, wobei "parameters" eine "text" -Spalte hat. – pyfl88

Verwandte Themen