工作模式
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):null值 列“status_id”违反了非空约束
答案 0 :(得分: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
答案 1 :(得分:-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