2016-11-08 68 views
4

所以我實現了User自引用關聯作爲user跟隨另一個user ...典型追隨者/追隨模型的方式。我很困惑如何爲下面的每個函數實現一個正確的查詢表達式。我明白爲每個功能做了什麼,但我不知道如何實現它們。Ecto查詢自引用關聯

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 

Follower模式:

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

    timestamps() 
end 
+0

'following?'和'fol​​lowed_by?'只需在連接表中查看記錄是否存在,是否可以? 'follow'可以通過id和'unfollow'將一個Repo.insert插入到連接表中去除這樣的記錄。他們應該是每個單線。 – Johannes

+0

謝謝Johannes。我明白爲每個功能做了什麼,但我不知道如何實現它們。如果這是有道理的。 –

回答

0

我是新來的藥劑很好,但讓我當時一看這個我可能會需要這樣的未來。我會嘗試;

def following?(user, user2) do 
    user = Repo.get(User, user) |> Repo.preload(:followers) 
    followers = hd(user.followers) 
    Enum.any?(followers, fn e -> e == user2 end) 
end 

我不知道這是否有幫助,但我會去這樣的事情。我現在也無法測試它。希望能幫助到你。

0

乍一看,你的模式對我來說很好看。我想嘗試這樣的事:

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 

退房Ecto.Repo,你將能夠輕鬆地做其他兩種方法。 :-)

+0

僅供參考:我不確定您是否需要在某個時間使用ID或使用用戶結構應該沒問題。 – Johannes