2016-12-06 7 views
1

Ich versuche, dieses Hex-Paket zu verwenden: https://github.com/meh/amnesiaElixier + Amnesie: Wie liest man ein Attribut?

Hier ist mein Schema:

use Amnesia 
require Logger 
require IEx 
defdatabase Database do 
    deftable User, [{ :id, autoincrement }, :device_identifier, :match_history], type: :ordered_set, indices: [:device_identifier] do 
    @type t :: %User{ id: non_neg_integer, device_identifier: String.t, match_history: List.t } 

    ... 
    end 
end 

und hier, wo der Fehler auftritt:

Amnesia.transaction do 
    // IEx.pry 
    queue = User.where(:device_identifier != device_identifier) 
    if queue do 
    Logger.info "dequeuing another user" 
    matched_user = List.first(queue.values) 
    matched_user |> User.delete 
    push socket, "match_found", %{ device_identifier: matched_user.device_identifier } 
    else 
    Logger.info "queuing user" 
    push socket, "queued", %{} 
    end 
end 

Wenn ich versuche, matched_user.device_identifier zu nennen, es schlägt fehl. Aber ist das nicht ein Attribut auf dem Modell? In der README im Github Repo ruft es content auf dem Nachrichtenmodell, also warum kann ich nicht dasselbe mit device_identifier auf meinem Benutzermodell?

Ich versuche es sogar mit dem id Feld:

pry(8)> matched_user.id 
** (UndefinedFunctionError) function Database.User.id/1 is undefined or private. Did you mean one of: 

     * id/0 

Gibt es einen Weg, um herauszufinden, welche Methoden meines matched_user Objekt reagiert?

+0

Können Sie versuchen, den Wert von 'matched_user' zu drucken, bevor Sie' matched_user.id' ausführen? – Dogbert

+0

@Dogbert yeh Ich verstehe: '{Database.User, 2," 5pyia9cej4 ", nil}' – Edmund

Antwort

3

Amnesia gibt standardmäßig ein Tupel für jeden übereinstimmenden Eintrag an Stelle der entsprechenden Struktur zurück. In Ihrem Fall wurde beispielsweise {Database.User, 2, "5pyia9cej4", nil} zurückgegeben. Um Strukturen aus den rohen Abfrageergebnissen zurückzuholen, bietet Amnesia eine komfortable Funktion Amnesia.Selection.values/1. Die folgende Änderung sollte funktionieren:

ersetzen
matched_user = List.first(queue.values) 

mit

matched_user = List.first(Amnesia.Selection.values(queue)) 

Vielleicht wollen Sie auch Muster verwenden, hier passend den Code idiomatische zu machen:

[matched_user | _] = Amnesia.Selection.values(queue) 
+0

wow !! Wie hast du das herausgefunden ?? – Edmund

+0

Weißt du, wie ich einen bestehenden Datensatz "aktualisieren" würde? Ich kann keine Dokumente zu diesem Thema finden ... – Edmund

+0

Ich habe 'Amnesia.Selection.values' in den Tests gefunden: https://github.com/meh/amnesia/blob/211d98275c085a9e3049ccb8db8d29f76b3ffbfc/test/amnesia/database_test. exs # L56. – Dogbert

0

@ Edmund über Ihre Frage in dem Kommentar, wie man einen vorhandenen Datensatz aktualisiert. Konnte den Code in einem Kommentar nicht formatieren, also schrieb ich eine Antwort. Ich bin einfach drauf reingefallen. Hier ist ein kleiner Func, dass es scheint, den Trick zu tun, wie man einen Rekord aktualisiert. Zuerst müssen Sie die Datensätze auswählen, die Sie aktualisieren müssen. Ich bin völlig neu in Elixir, aber ich denke, es ist nicht so schlimm:

+0

Es funktioniert nur, wenn der Datenbanktyp 'set' ist. Wenn die Datenbank eine "Tasche" ist, wird ein neuer Datensatz erstellt – Macabeus