【问题标题】:Default belongs_to association value默认 belongs_to 关联值
【发布时间】:2017-12-18 17:24:49
【问题描述】:

工作模式

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

当我插入作业时,我需要输入默认作业状态(如果它不在参数中)。我知道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): null value in “status_id”列违反非空约束

【问题讨论】:

  • 注意:如果我在迁移中添加默认值,则插入时不会出错并且状态已成功关联,但我返回给用户的变更集对象不知道更改并返回 null status_id

标签: associations elixir phoenix-framework ecto changeset


【解决方案1】:

您可以将默认值放在迁移中并将关联字段定义为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 的更多详细信息。

【讨论】:

    【解决方案2】:

    最适合创建状态的位置是在您的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多