2016-07-29 13 views
1

Ich versuche herauszufinden, die beste Möglichkeit, ein first_name und last_name Feld in Ecto zu kombinieren.Gibt es eine Ecto-Entsprechung zu einer Active Record-Instanzmethode in Ruby?

Im Schiene aktiven Datensatz kann ich eine Instanz Methode wie erstellen:

def name 
    self.first_name + self.last_name 
end 

dann, wenn ich eine aktive Datensatz Instanz erstelle ich User.name verwenden kann. Wenn ich den Vor- und Nachnamen oder eine andere Logik mit meinem Ecto-Modell kombinieren möchte, wie würde ich das tun? Dies ist ein einfaches Beispiel und ich könnte es einfach im Handumdrehen verketten, aber was wäre, wenn es eine kompliziertere Logik gäbe?

Antwort

3

Sie müssten eine Ecto.Schema (in der Regel erhalten, indem Sie einige Repo Methode aufrufen) an die Methode übergeben. Von dort aus greifen Sie auf die erforderlichen Felder des Modells zu, führen Operationen für sie aus und geben das Ergebnis zurück. So etwas wie

def name(user) do 
    user.first_name <> user.last_name 
    end 

Platz es in Modell User.ex Datei, rufen Sie dann User.name(user) von überall in Ihrer Anwendung. (MyApp.User.name(user) wenn User nicht Aliasing)

2

Ich hatte mit dem gleichen Problem zu kämpfen, als ich begann, Elixier zu schreiben. Die Instanzmethode juckt aus dem Denken in Objekten, da Elixir eine funktionale Sprache ist, werden sich diese Dinge falsch anfühlen. Der beste Rat, den ich geben kann, ist zu akzeptieren, dass dies so ist und versuche, in Daten anstelle von Objekten zu denken :)

1

Dies ist normalerweise ein View-Problem in Ecto/Phoenix. Es ist nicht etwas, was Sie normalerweise im Schema tun würden.