我有这样的订阅。
defmodule Rebirth.Subscription do
use Rebirth.Web, :model
schema "subscriptions" do
...
belongs_to :user, Rebirth.User
...
end
...
def update_user(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
|> cast_assoc(:user, required: false)
end
end我想将用户与订阅相关联。
所以我试着
Rebirth.Subscription.update_user(subscription, %{user_id: 1})或
Rebirth.Subscription.update_user(subscription, %{user: user})当我运行它时,我会得到以下错误:
** (ArgumentError) unknown assoc `user` in `cast_assoc`如何更新user_id?
谢谢!
发布于 2016-03-18 07:28:45
has_one用于“强制转换关联模型”,只能与和一起使用。belongs_to关系在调用它的模型中定义了外来id。has_many和has_one依赖于具有外键的“另一个”对象。
如果您正在创建具有许多其他对象的对象,则检查所有对象是否有效是有意义的。cast_assoc将在各自的模块中调用cast。
您的用户可能有很多订阅(我在这里猜测),所以在创建订阅时创建用户并通过cast_assoc检查用户是否有效是没有意义的。通常,在这种情况下,用户将存在于数据库中。
在您的示例中,您只想检查强制转换中是否存在关联的模型,因此您应该使用:
|> assoc_constraint(:user)这并不验证用户,而是检查给定的user_id是否存在于数据库中。现在,当您想更新用户的订阅时,可以这样做:
user = Repo.get(User, id)
subscription = Ecto.build_assoc(user, :subscriptions, other_fields_as_map)注意,它需要用户模型上的has_one或has_many。
或者,您可以像之前尝试的那样简单地更新用户id:
Rebirth.Subscription.update_user(subscription, %{user_id: 1})这一次,它将检查数据库中是否存在给定的用户id,但是您将无法在这里传递整个用户对象。
如果您想更新关联的用户,则必须在两个步骤中显式地进行。( a)获取用户,b)使用其模块中定义的变更集更新用户。
最后请注意,如果您没有为更新用户进行单独的验证(我认为在这个场景中不应该这样做),最好将函数从update_user重命名为changeset。相同的变更集可用于创建和更新模型。
https://stackoverflow.com/questions/36075581
复制相似问题