gpt4 book ai didi

elixir - (RuntimeError) 不支持使用 cast/4 强制转换 assocs,请改用 cast_assoc/3

转载 作者:行者123 更新时间:2023-12-04 03:03:12 25 4
gpt4 key购买 nike

我不明白这个错误,我搜索了很多。没有一个例子显示多重关联?这是代码。

我的访问列表:

defmodule Db.AccessList do
use Ecto.Schema

schema "access_lists" do
belongs_to :user_id, Db.User
belongs_to :role_id, Db.Role
belongs_to :asset_id, Db.Asset
belongs_to :project_id, Db.Project

timestamps()
end

def changeset(model, params \\ %{}) do
model
|> Ecto.Changeset.cast(params, [:user_id, :role_id, :asset_id, :project_id])
|> Ecto.Changeset.validate_required([:user_id, :role_id])
end
end

测试:

defmodule AccessListTest do
alias Db.{ AccessList }
use ExUnit.Case

@valid_attr %{user_id: 1, role_id: 1, asset_id: 1, project_id: 1 }

@tag :wip
test "ACCESSLIST.1 valid attribute" do
changeset = AccessList.changeset(%AccessList{}, @valid_attr)
assert changeset.valid?
end

@tag :wip
test "ACCESSLIST.2 invalid attribute" do
invalid_attr = Map.put(@valid_attr, :user_id, nil)
changeset = AccessList.changeset(
%AccessList{}, invalid_attr
)
refute changeset.valid?
end
end

这里是错误:

......

1) test ACCESSLIST.1 valid attribute (AccessListTest)
test/access_list_test.exs:8
** (RuntimeError) casting assocs with cast/4 is not supported, use cast_assoc/3 instead
code: changeset = AccessList.changeset(%AccessList{}, @valid_attr)
stacktrace:
(ecto) lib/ecto/changeset.ex:485: Ecto.Changeset.type!/2
(ecto) lib/ecto/changeset.ex:464: Ecto.Changeset.process_param/7
(elixir) lib/enum.ex:1826: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/changeset.ex:449: Ecto.Changeset.cast/6
(db) lib/db/access_list.ex:15: Db.AccessList.changeset/2
test/access_list_test.exs:10: (test)



2) test ACCESSLIST.2 invalid attribute (AccessListTest)
test/access_list_test.exs:15
** (RuntimeError) casting assocs with cast/4 is not supported, use cast_assoc/3 instead
code: changeset = AccessList.changeset(
stacktrace:
(ecto) lib/ecto/changeset.ex:485: Ecto.Changeset.type!/2
(ecto) lib/ecto/changeset.ex:464: Ecto.Changeset.process_param/7
(elixir) lib/enum.ex:1826: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/changeset.ex:449: Ecto.Changeset.cast/6
(db) lib/db/access_list.ex:15: Db.AccessList.changeset/2
test/access_list_test.exs:18: (test)



Finished in 0.3 seconds
53 tests, 2 failures, 45 skipped

最佳答案

由于 belongs_to 名称末尾有 _id(例如 user_id),Ecto 认为该关联称为 user_id 并且数据库字段是 user_id_id。这就是错误消息显示 user_id 是一个关联并希望您使用 cast_assoc 的原因。您需要从所有关联名称中删除 _id 后缀,因为我假设数据库字段最后只有一个 _id:

belongs_to :user, Db.User
belongs_to :role, Db.Role
belongs_to :asset, Db.Asset
belongs_to :project, Db.Project

关于elixir - (RuntimeError) 不支持使用 cast/4 强制转换 assocs,请改用 cast_assoc/3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47128598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com