2016-07-25 3 views
0

첫 번째 :이 topic을 찾았지만 작동하지 않습니다.Elixir Ecto 빈 삽입 belongs_to

나는 두 가지 모델

Council(1)<->(n)Department 

사이의 관계를하고 난 부서에 관계없이 회의를 삽입 할.

CREATE TABLE public.councils 
(
    id integer NOT NULL DEFAULT nextval('councils_id_seq'::regclass), 
    name character varying(255), 
    description character varying(255), 
    department_id integer, 
    inserted_at timestamp without time zone NOT NULL, 
    updated_at timestamp without time zone NOT NULL, 
    CONSTRAINT councils_pkey PRIMARY KEY (id), 
    CONSTRAINT councils_department_id_fkey FOREIGN KEY (department_id) 
     REFERENCES public.departments (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

문서는 cast/4가되지 않습니다 있다고하지만 피닉스는 그 자체로 cast/3 & validate_required/3으로 변경 집합을 만들어이 SQL 스키마

schema "councils" do 
    field :name, :string 
    field :description, :string 
    belongs_to :department, Db2.Department 
    many_to_many :students, Db2.Student, join_through: Db2.StudentCouncil 
    many_to_many :periods, Db2.Period, join_through: Db2.StudentCouncil 

    timestamps() 
end 

:

나는이 체외 스키마있어 . 하여 기본 phoenix.html 양식 요소를 사용하여 양식 I'am를 들어

def changeset(struct, params \\ %{}) do 
    struct 
    |> cast(params, [:name, :description, :department_id]) 
    |> validate_required([:name]) 
    |> unique_constraint(:name) 
    |> assoc_constraint(:department) 
end 

: 나는 단지 내가 다음과 같은 변경 집합이되도록 department을 추가했습니다.

[debug] QUERY OK db=1.2ms queue=0.1ms 
SELECT u0."id", u0."uid", u0."is_admin", u0."is_staff", u0."password_hash", u0."inserted_at", u0."updated_at" FROM "users" AS u0 WHERE (u0."id" = $1) [1] 
[debug] Processing by Db2.CouncilController.create/2 
Parameters: %{"_csrf_token" => "KwpdFCZ/bFN9fwkcXSAYLhRCIzgOAAAAXeoEa4+d1MoT7SvzZpgOdg==", "_utf8" => "✓", "council" => %{"department_id" => "", "description" => "", "name" => "test2"}} 
    Pipelines: [:browser] 
[debug] QUERY OK db=1.2ms queue=0.1ms 


#Ecto.Changeset<action: :insert, changes: %{description: "", name: "test2"}, 
    errors: [department_id: {"is invalid", [type: :id]}], data: #Db2.Council<>, 
    valid?: false> 

답변

1

문제는 당신이 department_id 대신 nil 빈 문자열을 보내는 것입니다 : 내가 양식 피닉스를 제출 는 다음과 말했다.

당신은 명시 적으로 nildepartment_id을 설정할 수 있습니다
iex(1)> MyApp.Post.changeset %MyApp.Post{}, %{"title" => "Hello"} 
#Ecto.Changeset<action: nil, changes: %{title: "Hello"}, errors: [], 
data: #MyApp.Post<>, valid?: true> 
iex(2)> MyApp.Post.changeset %MyApp.Post{}, %{"title" => "Hello", "user_id" => nil} 
#Ecto.Changeset<action: nil, changes: %{title: "Hello"}, errors: [], 
data: #MyApp.Post<>, valid?: true> 
iex(3)> MyApp.Post.changeset %MyApp.Post{}, %{"title" => "Hello", "user_id" => "1"} 
#Ecto.Changeset<action: nil, changes: %{title: "Hello", user_id: 1}, errors: [], 
data: #MyApp.Post<>, valid?: true> 
iex(4)> MyApp.Post.changeset %MyApp.Post{}, %{"title" => "Hello", "user_id" => ""} 
#Ecto.Changeset<action: nil, changes: %{title: "Hello"}, 
errors: [user_id: {"is invalid", [type: :id]}], data: #MyApp.Post<>, 
valid?: false> 

changeset를 호출하기 전에, 또는 모든 빈 문자열 같은 일을 피닉스의 scrub_params 플러그를 사용합니다 : 빈 문자열은 자동으로 nil 캐스팅되지 않습니다

# web/controllers/council_controller.ex 
plug :scrub_params, "council" when action in [:create] 

(필드 이름을 "council"으로 변경하고 해당 필드를 수락하는 작업 목록에 [:create]을 입력하십시오.)

+0

woOt? 고맙습니다. 매력처럼 작동 :) –