gpt4 book ai didi

elixir - Ecto 变更集和多对多关联 "is invalid"错误

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

我有架构 银行 货币 多对多协会。我为银行创建了一个包含货币的选择表单。

银行.ex

schema "banks" do
field :name, :string
many_to_many :currencies, App.Currency, join_through: "banks_currencies"
end

@required_fields ~w(name)
@optional_fields ~w()

def changeset(model, params \\ %{}) do
model
|> cast(params, @required_fields, @optional_fields)
|> cast_assoc(:currencies)
end

表单.html.ex
<%= multiple_select(form, :currencies, @currencies) %>

问题是:当我提交选择了某些货币的表单时,变更集返回“无效”错误。我在 iex 中模拟:
iex(8)> App.Bank.changeset bank, %{"currencies" => ["1"]}  
#Ecto.Changeset<action: nil, changes: %{},
errors: [currencies: {"is invalid", [type: {:array, :map}]}],
data: #App.Bank<>, valid?: false>

我安装了最新的 Phoenix,最近从 1.1.4 升级到 1.2

最佳答案

我不确定这是正确的解决方案,但它有效

银行.ex

def changeset(model, params \\ %{}) do

currencies = Currency
|> Currency.by_ids(if params["currencies"], do: params["currencies"], else: [])
|> App.Repo.all
|> Enum.map(&Ecto.Changeset.change/1)

model
|> cast(params, @required_fields, @optional_fields)
|> put_assoc(:currencies, currencies)
end

货币.ex
def by_ids(query, ids) do
from c in query, where: c.id in ^ids
end

关于elixir - Ecto 变更集和多对多关联 "is invalid"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555335/

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