我的模式银行和货币与多对多关联。我为 Bank 创建了一个表单,其中select包含 currency 。
bank.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
form.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
答案 0 :(得分:1)
我不确定它是否是正确的解决方案,但它有效
bank.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
currency.ex
def by_ids(query, ids) do
from c in query, where: c.id in ^ids
end