2017-11-06 5 views
0

이 오류를 이해하지 못하고 많이 검색했습니다. 예제 중 다중 연결을 보여주고 있습니까? 여기에 코드가 있습니다.(RuntimeError) cast/4를 사용하여 캐스팅 assoc가 지원되지 않습니다. 대신 cast_assoc/3을 사용하십시오.

내 AccessList :

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 
+0

는'belongs_to' 선언에서 모든 "_id"접미사를 제거하십시오. – Dogbert

+0

hahahaha, 신참의 실수 야, @ 도그 버트는 대답을 만들어 주시고 받아 들인다. 죄송합니다. –

답변

2

_id (예 user_id)을 belongs_to 이름 끝에 , 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