Чтобы ответить на вопрос № 11, есть вопрос о вашей бизнес-логике, на который нужно ответить:
Когда ваши пользователи назначают пользователя для роли, они создают новые роли?Или просто выбирая из предопределенных ролей?
Я бы предположил, что это последнее.Если это так, я думаю, вы могли бы сделать следующее ...
defmodule YourApp.User do
use Ecto.Schema
import Ecto.Changeset
schema "users" do
...
has_many :user_roles, YourApp.UserRole
end
def changeset(user, params) do
user
|> cast_things...
|> cast_assoc(:user_roles)
end
end
... потому что ваши пользователи никогда не меняют доступные роли.Просто пользовательские роли.Что позволило бы вам сделать что-то вроде ...
user = YourApp.Repo.get (YourApp.User, 1)
user
|> YourApp.User.changeset(%{user_roles: [%{role_id: 1, status: "Active"}]})
|> YourApp.Repo.update
Это возможно.Тем не менее, мне лично иногда трудно работать с cast_assoc
, особенно учитывая обязательную предварительную загрузку и тонкие правила для обработки , поэтому я склонен работать непосредственно над таблицами соединений.Вот почему я упомянул в своем комментарии выше, что я запутался, почему # 9 и # 10 не работают выше.