2016-11-08 5 views
4

So habe ich eine User Selbstreferenzierung Verband als eine Möglichkeit für eine user zu einem anderen user ... die typischen Followern/folgenden Modell implementiert. Ich bin verwirrt, wie man einen korrekten Abfrageausdruck für jede Funktion unten implementiert. Ich verstehe, was für jede Funktion zu tun ist, aber ich weiß nicht, wie ich sie umsetzen soll.Ecto Abfrage für selbstreferenzierende Assoziation

defmodule App.User do 

    schema "users" do 
    #... 
    has_many :followers, App.Follower, foreign_key: :followed_id 
    has_many :following, through: [:followers, :follower] 
    end 

    #... 

    @doc """ 
    Return true if `user` is following `user2` 
    """ 
    def following?(user, user2) do 
    end 

    @doc """ 
    Return true if `user` is followed by `user2` 
    """ 
    def followed_by?(user, user2) do 
    end 

    @doc """ 
    `user` follows `user2` 
    """ 
    def follow(user, user2) do 
    end 

    @doc """ 
    `user` unfollows `user2` 
    """ 
    def unfollow(user, user2) do 
    end 

end 

Das Follower Schema:

schema "followers" do 
    belongs_to :followed, User 
    belongs_to :follower, User 

    timestamps() 
end 
+0

'folgend?' Und 'folge_by?' Könnte man einfach in der Join-Tabelle nachsehen, ob der Datensatz da ist, oder? 'follow' könnte eine Repo.insert in die Join-Tabelle mit beiden IDs und" unfollow "entfernen einen solchen Datensatz tun. Sie sollten jeweils Einzeiler sein. – Johannes

+0

Danke Johannes. Ich verstehe, was für jede Funktion zu tun ist, aber ich weiß nicht, wie ich sie umsetzen soll. Wenn das Sinn macht. –

Antwort

0

Ich bin neu und zu Elixir aber ich werde wahrscheinlich brauchen dies auch in Zukunft so dass ich einen Blick in diese hatte. Ich würde versuchen;

Ich bin mir nicht sicher, ob das hilft, aber ich würde für so etwas gehen. Ich kann es auch im Moment nicht testen. Ich hoffe es hilft.

0

Auf den ersten Blick sehen Ihre Schemas gut aus. Ich würde so etwas wie dies versuchen:

def follow(user, user2) do 
    Repo.insert! %Follower{follower: user2, followed: user} 
end 

def following?(user, user2) do 
    !! Repo.get_by(Follower, [follower: user2, followed: user]) # !! so that it returns true or false. You can also write xy != nil. 
end 

Check out Ecto.Repo und Sie werden die beiden anderen Methoden leicht tun können. :-)

+0

FYI: Ich bin nicht sicher, ob Sie IDs zu irgendeinem Zeitpunkt verwenden müssen oder die Verwendung der Benutzerstrukturen sollte in Ordnung sein. – Johannes

Verwandte Themen