Join 自引用关联的EXTO查询

Join 自引用关联的EXTO查询,join,elixir,phoenix-framework,ecto,Join,Elixir,Phoenix Framework,Ecto,因此,我实现了一个用户自引用关联,作为用户跟随另一个用户的一种方式……典型的追随者/跟随模式。对于如何为下面的每个函数实现正确的查询表达式,我感到困惑。我知道每个函数应该做什么,但我不知道如何实现它们 defmodule App.User do schema "users" do #... has_many :followers, App.Follower, foreign_key: :followed_id has_many :following, throu

因此,我实现了一个
用户
自引用关联,作为
用户
跟随另一个
用户
的一种方式……典型的追随者/跟随模式。对于如何为下面的每个函数实现正确的查询表达式,我感到困惑。我知道每个函数应该做什么,但我不知道如何实现它们

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

我对长生不老药也不熟悉,但我将来可能需要它,所以我对它进行了研究。我会尝试

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

我不确定这是否有帮助,但我会选择这样的方式。我现在也不能测试它。希望能有所帮助。

乍一看,您的模式对我来说很不错。我想试试这样的东西:

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

签出后,您将能够轻松完成其他两种方法。:-)

后面的?
后面的?
可以在联接表中进行查找,看看记录是否在那里,不是吗
follow
可以使用id和
unfollow执行Repo.insert到联接表中删除这样的记录。它们应该是一行一行的谢谢Johannes。我知道每个函数应该做什么,但我不知道如何实现它们。如果这有意义的话。仅供参考:我不确定您是否需要在某个时候使用id,或者使用用户结构应该可以。