2016-06-03 7 views
3

Ich verwende den Ahoy-Edelstein, um Benutzeraktionen in einer Rails 4-App aufzuzeichnen. Ereignisse werden aufgezeichnet und in der Tabelle Ahoy :: Event gespeichert. Für jedes Ereignis ist ein Hash-Attribut properties als Text gespeichert. In diesem Fall versuche ich, die Anzahl der Artikelansichten für einen bestimmten Artikel zurückzugeben.Abfragen des Ahoy-Eigenschafts-Hashwerts

Ich folge der vorgeschlagenen Syntax in der Gem-Dokumentation hier: https://github.com/ankane/ahoy#querying-properties, die ein Beispiel Ahoy::Event.where("properties LIKE '%\"store_id\": \"1\"%'").count für die Abfrage eines Eigenschaften-Text-Hash gibt, aber ich konnte keine genauen Ergebnisse zurückgeben.

Hier ist der Controller-Event ich dies zu testen bin Tracking:

def show @article = Article.friendly.find(params[:id]) ... ahoy.track "Viewed article", article_id: @article.id ... end

In Konsole wie erwartet ich ein Ereignis sehen kann, wird zurückgegeben, wenn ich für Artikel mit dem Namen zu suchen: „gesehen Artikel“ :

Ahoy::Event.where(name: "Viewed article") Ahoy::Event Load (89.1ms) SELECT "ahoy_events".* FROM "ahoy_events" WHERE "ahoy_events"."name" = $1 [["name", "Viewed article"]] => #<ActiveRecord::Relation [#<Ahoy::Event id: "6cda3790-625d-4b73-8ef0-262a26b29618", visit_id: "2d56efa6-3590-4a64-acec-c0fd0ba07727", user_id: nil, name: "Viewed article", properties: {"article_id"=>562}, time: "2016-06-03 18:49:28">]>

Aber wenn ich durch Abfragen für Ereignisse mit dem entsprechenden article_id das gleiche Ereignis zu finden versuchen, wird das Ereignis nicht gefunden:

Ahoy::Event.where("properties LIKE '%\"article_id\": \"562\"%'").count (207.5ms) SELECT COUNT(*) FROM "ahoy_events" WHERE (properties LIKE '%"article_id": "562"%') => 0

Alle Vorschläge werden sehr geschätzt.

Antwort

1

Update: Ahoy hat tatsächlich eine wunderbare where_properties Methode, die was Sie wollen, und berücksichtigt Ihre Datenbanktyp berücksichtigt! Es sieht wie folgt aus:

Ahoy::Event.where(name: "Viewed product").where_properties(product_id: 123).count

Documentation here


Sie wirklich kämpfen bergauf durch eine Textspalte mit Ihrer Eigenschaften Hash zu speichern. Der Hash muss in Text codiert werden, bevor er in Ihrer Datenbank gespeichert wird. Jetzt müssen Sie Ihre Datenbank basierend auf dem codierten Formular abfragen (das je nach verwendetem Codierungsmechanismus variiert). Pfui! Meine Vorschläge:

  1. Am besten ist es, den Eigenschaften-Hash in einer JSON-Spalte zu speichern! Nicht alle Datenbanken unterstützen dies, aber wenn Sie können, tun Sie dies stattdessen. Sie können dann direkte Abfragen für JSON-Eigenschaften vornehmen und sogar Indizes erstellen usw. Das ist, wie ich es mache, und es funktioniert sehr gut. Yay Postgres!

  2. Versuchen Sie nicht, den Eigenschaften-Hash abzufragen, bis er in einen Ruby-Hash im Speicher decodiert wurde. Machen Sie die genaueste Abfrage können Sie mit allem außer die Eigenschaften Hash (wie die user_id & event_name), dann nur durch die resultierenden Ahoy :: Event-Objekte Schleife ihre Eigenschaften in Ruby überprüfen. Es kann langsam sein, aber es wird einfach und fehlerfrei sein. Für Leistungsoptimierungen könnten Sie dies immer in einem Hintergrundjob tun und die Ergebnisse zwischenspeichern!

Verwandte Themen