Попытайтесь использовать следующие стратегии, чтобы улучшить производительность вашего приложения:
Использование render_many / 4 является правильным.
Если вы хотите определить функцию рендеринга role.json в том же модуле, вы можете сделать:
def render("user.json", %{user: user}) do
%{
id: user.id,
name: user.name,
roles: render_many(user.roles, __MODULE__, "role.json", as: :role)
}
end
def render("role.json", %{role: role}) do
%{
id: role.id
...
}
end
Обратите внимание, что мы передаем функцию as: :role
в функцию render_many. Это связано с тем, что назначение (часть %{role: role}
) выводится из имени представления. В этом случае это UserView
, поэтому по умолчанию это будет %{user: user}
.
Если вы определяете модуль RoleView
, вы можете просто переместить функцию def render("role.json")
в новый RoleView
и вызовите render_many
без опции as
:
...
roles: render_many(user.roles, MyApp.RoleView, "role.json")
...
Другой вариант, который может быть предпочтительным для вас, - это получить протокол в вашей модели:
defmodule App.Role do
use App.Web, :model
@derive {Poison.Encoder, only: [:id, :name]}
schema "roles" do
has_many :roles_users, App.RolesUser
has_many :users, through: [:roles_users, :user]
field :name, :string
timestamps
end
Лично Я чувствую, что эта пара моделирует ваше мнение, поэтому я предпочитаю использовать первый вариант.
__MODULE__
не отображался как MODULE . – Gazler 14 April 2016 в 13:57