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