기본

2017-12-18 4 views
0

작업 모델기본

schema "jobs" do 
    belongs_to :status, Test.JobStatus, 
    foreign_key: :status_id, 
    references: :id, 
    type: :string 
    timestamps() 
end 

와 나는이 상태 모델을 가지고 : 나는 그것하지 PARAMS의 경우 (기본 작업 상태를 둘 필요가

@primary_key {:id, :string, autogenerate: false} 
schema "job_statuses" do 
    field :title, :string 
    field :description, :string 
end 

내가 일을 삽입하고 때). 내가 belongs_to 협회의 기본값에 대해 알고 있지만이 것은 아마도 당신이 관계를 수립 할 때 기본값을 할당하기위한 것입니다. 어느 누구도 내가 새로 생성 한 작업 (기본 작업 상태 ID가 "acitve"이고 이미 데이터베이스에 있음)에 대한 기본 상태를 입력하는 방법을 알려줄 수 있습니까? 열 "status_id"에서 null 값 위반 : 샘플은이

Interactive Elixir (1.5.2) - press Ctrl+C to exit (type h() ENTER for help) 
iex(1)> Test.Jobs.create_job_status() 
iex(2)> Test.Jobs.test_default_status() 
이 이 이 (Postgrex.Error) ERROR 23502 (not_null_violation가)

할 프로젝트를 복제 한 후 여기 https://github.com/tanweerdev/jobs

이미 null이 아닌 제약

+0

참고 : 마이그레이션 중에 기본값을 추가하면 삽입하는 동안 오류가 발생하지 않고 상태가 제대로 동기화되지만 사용자에게 반환하는 변경 집합 개체가 변경 사항을 인식하지 못하고 null'status_id'를 반환합니다 –

답변

3

당신은 이전에 기본을두고 read_after_writes: true로 협회 필드를 정의 할 수 있습니다. 이렇게하면 레코드를 삽입 한 후 레코드가 성공적으로 삽입 된 후 해당 필드가 여전히 nil 인 주석에서 언급 한 문제를 해결할 데이터베이스에서 해당 필드를 다시 읽게됩니다. define_fieldhereread_after_writeshere에 대한 자세한 내용은 문서 출력

belongs_to :status, Test.JobStatus, 
    foreign_key: :status_id, 
    references: :id, 
    type: :string, 
    define_field: false 

field :status_id, :integer, read_after_writes: true 

확인합니다.

+0

감사 . 완벽하게 작동했습니다 (: –

-1

상태 생성을위한 가장 적절한 장소는 내부 일 것입니다. 당신의 Job.changeset/2 콜백 :

@doc false 
    def changeset(%Job{} = job, attrs) do 
    job 
    |> cast(attrs, @fields) 
    |> validate_required(...) 
    |> create_and_put_default_status() # ⇐ HERE 
    |> ... 
    end 

create_and_put_default_status()의 구현은 다음과 같은 사양을 준수합니다 :

@spec create_and_put_default_status(Plug.Conn.t) :: Plug.Conn.t