默认belongs_to关联值

问题描述 投票:0回答:2

工作模式

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

我有一个状态模型:

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

当我插入作业时,我需要将默认作业状态(如果它不在params中)。我知道belongs_to关联中的默认值,但这可能是为了在分配关系时分配默认值。任何人都可以指出我如何为任何新创建的作业设置默认状态(假设作业状态ID为“acitve”且已在数据库中)。样品已经在这里https://github.com/tanweerdev/jobs

克隆项目后,就这样做

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):“status_id”列中的空值违反非空约束

associations elixir phoenix-framework ecto changeset
2个回答
3
投票

您可以将默认值放在迁移中,并将关联字段定义为read_after_writes: true。这将确保在插入记录后,将从数据库中读回该字段,这将解决您在注释中提到的问题,即在成功插入记录后该字段仍为nil

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

field :status_id, :integer, read_after_writes: true

有关define_field hereread_after_writes here的更多详细信息,请查看文档。


-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
© www.soinside.com 2019 - 2024. All rights reserved.