Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir EXTO变更集和多对多关联“无效”错误_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir EXTO变更集和多对多关联“无效”错误

Elixir EXTO变更集和多对多关联“无效”错误,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我有多对多关联的银行和货币模式。我用select为银行创建了一个包含货币的表单 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 \\ %

我有多对多关联的银行和货币模式。我用select为银行创建了一个包含货币的表单

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
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
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。我不确定它是不是正确的解决方案,但它可以工作

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
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
货币兑换率

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