在类似Twitter的应用中,User
可以通过User
模型关注其他Connection
,如果Follower
后跟@user
,我会遇到问题{1}}。
网络/模型/ user.ex
defmodule MyApp.User do
use MyApp.Web, :model
schema "users" do
field :last_name, :string
has_many :follower_connections, MyApp.Connection, foreign_key: :followee_id
has_many :followers, through: [:follower_connections, :follower]
has_many :followee_connections, MyApp.Connection, foreign_key: :follower_id
has_many :followees, through: [:followee_connections, :followee]
[...]
网络/模型/ connection.ex
defmodule MyApp.Connection do
use MyApp.Web, :model
schema "connections" do
belongs_to :follower, MyApp.User
belongs_to :followee, MyApp.User
[...]
网络/控制器/ user_controller.ex
[...]
def show(conn, %{"id" => id}) do
user =
Repo.get!(User, id)
|> Repo.preload([:followers, :followees,
:followee_connections,
:follower_connections])
conn
|> assign(:user, user)
|> render("show.html")
end
[...]
网络/模板/用户/ show.html.eex
<ul>
<%= for connection <- @user.follower_connections do %>
<li>
<%= connection.follower.last_name %>
<%= if connection.followee.???include?(????) do %>
(You follow him/her back.)
<% end %>
</li>
<% end %>
</ul>
如何判断connection.follower
是@user.followees
的一部分还是其中包含的内容?
奖金问题:Ecto文档中的这个位置是什么?
答案 0 :(得分:1)
我认为这可行:
<%= if Enum.any?(@user.followee_connections, fn(x) -> x.followee_id == connection.follower_id end) do %>
(You follow him/her back.)
<% end %>
可能有一种更好的方式可以让你开始。
此外,我认为预加载所有关注者和连接可能会占用大量内存,例如,如果此人拥有数万名粉丝。我认为将这些内容重写为有限制的查询可能是有意义的,因此它只会加载用户的50个粉丝或其他任何内容,而不是每次都加载。