2016-11-08 12 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

'に続いて?'と 'follow_by?'レコードが存在するかどうかを調べるためにジョインテーブルでルックアップを行うだけでいいですか? 'follow'は、idと' unfollow'の両方を使ってJoinテーブルにRepo.insertを実行して、そのようなレコードを削除することができます。それらはそれぞれ1ライナーでなければなりません。 – Johannes

+0

ありがとうございました。私は各機能のために何をすべきかを理解していますが、それらを実装する方法はわかりません。それが意味をなさないならば。 –

答えて

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をチェックアウトし、あなたは簡単に他の2つのメソッドを行うことができるようになります:私はこのような何かを試してみました。 :-)

+0

FYI:ある時点でIDを使用する必要があるか、ユーザー構造体を使用する必要があるかどうかはわかりません。 – Johannes