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,或者使用用户结构应该可以。