如何查找has_many关联的元素是否包含在另一个元素中?

时间:2016-05-10 19:40:33

标签: elixir phoenix-framework

在类似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文档中的这个位置是什么?

1 个答案:

答案 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个粉丝或其他任何内容,而不是每次都加载。