我尝试使用连接中的当前用户分配创建多对多关系。问题是我无法访问模型中的conn。我尝试用变更集传递它,但这似乎不是正确的方法。
处理此问题的最佳方法是什么?我想我可以将conn导入模型中。我有什么理由不想这样做吗?
以下是我的变更集现在的样子
def changeset(model, user, params \\ :invalid) do
model
|> cast(params, @required_fields)
|> put_assoc(:users, [user])
|> validate_required([:name])
|> unique_constraint(:name)
end
更新
结束史蒂夫的建议。为模式添加了用户标识的虚拟字段,并将此函数添加到变更集管道
def changeset(model, params \\ :invalid) do
model
|> cast(params, @required_fields)
|> associate_current_user(params)
|> validate_required([:name])
|> unique_constraint(:name)
end
def associate_current_user(model, params) do
case params do
%{"user_id" => id} ->
user = Repo.get!(User, id)
model
|> put_assoc(:users, [user])
_ ->
model
end
end
答案 0 :(得分:3)
我不会这样做。它起初可能很诱人,但是后来它会让你或其他人感到困惑,他们会维护这段代码。
模型是你的应用程序的独立层,因此在该区域中使用conn会将它与控制器非常接近地耦合。虽然,模型只是一个Elixir模块,所以在完美的世界中你可以使用它们而不需要Phoenix和请求/响应周期。
还要考虑对该功能进行单元测试 - 您是否可以确保conn始终看起来像您需要和需要的?
不要混淆顾虑。为了编排conn flow,你有控制器,从Phoenix 1.3来管理模式,你就有了有限的上下文。
答案 1 :(得分:1)
为什么不将当前的user_id添加到参数中并以这种方式处理。如果新/更新来自Web表单,则很容易在模板中获取current_user并添加隐藏的输入。