为什么为created_at
null,我将如何解决?
↳ app/controllers/projects_controller.rb:28:in `create'
Tag Upsert (5.6ms) INSERT INTO "tags" ("category","name") VALUES ('topic', 'career') ON CONFLICT ("id") DO UPDATE SET "type"=excluded."type","name"=excluded."name" RETURNING "id"
↳ app/controllers/projects_controller.rb:32:in `block in create'
Completed 500 Internal Server Error in 62ms (ActiveRecord: 31.0ms | Allocations: 22999)
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column "created_at" violates not-null constraint
DETAIL: Failing row contains (5, topic, career, null, null).
):
app/controllers/projects_controller.rb:32:in `block in create'
app/controllers/projects_controller.rb:31:in `each'
app/controllers/projects_controller.rb:31:in `create'
# projects_controller.rb
def create
@project = Project.create(project_params)
if @project.valid?
# tags
params[:tags].each do |tag|
@tag = Tag.upsert({ category: 'topic', name: tag })
ProjectTag.create(tag: @tag, project: @project)
end
respond_to do |format|
format.json { render json: { "message": "success!", status: :ok } }
end
end
end
upsert
无需很少的ActiveRecord即可在直接SQL中工作:
在单个SQL INSERT语句中将单个记录更新或插入(插入)到数据库中。它不会实例化任何模型,也不会触发Active Record回调或验证。
因此AR不会像平常一样碰触updated_at
或触摸created_at
。
最简单的方法是添加一个迁移,以在数据库中为created_at
和添加默认值updated_at
:
change_column_default :tags, :created_at, from: nil, to: ->{ 'now()' }
change_column_default :tags, :updated_at, from: nil, to: ->{ 'now()' }
然后,数据库将处理这些列。
迁移中需要注意两件事:
:from
和:to
选项,而不仅仅是新的默认值,可以进行可逆迁移。:to
值,以便使用PostgreSQLnow()
函数而不是字符串'now()'
。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句