2016-07-24 42 views
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 

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> 

我已經安裝了最新的鳳凰,最近從1.1.4升級到1.2

回答

1

我不知道是不是正確的解決方案,但它工作

銀行.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