i c*_*ode 10 ruby ruby-on-rails ruby-on-rails-6
抱歉,如果之前已经回答过这个问题,但我找不到明确的答案。
当然有人在使用时遇到过这个问题,upsert您需要指定包括created_at和在内的每一列updated_at?
created_at当更新插入发生时如何不更新时间戳?我只想插入created_at一次。
a = User.upsert({
name: ....,
age: ....
created_at: DateTime.now,
updated_at: DateTime.now
}, unique_by: :upsert_user_index )
Run Code Online (Sandbox Code Playgroud)
Bla*_*son 11
使用默认值更新现有表:
change_column :table_foos, :created_at, :datetime, null: false, default: -> { "CURRENT_TIMESTAMP" }
change_column :table_foos, :updated_at, :datetime, null: false, default: -> { "CURRENT_TIMESTAMP" }
Run Code Online (Sandbox Code Playgroud)
使用默认值创建新表:
create_table :table_foos do |t|
# date with timestamp
t.datetime :last_something_at, null: false, default: -> { "CURRENT_TIMESTAMP" }
# standard timestamps
t.timestamps default: -> { "CURRENT_TIMESTAMP" }
end
Run Code Online (Sandbox Code Playgroud)
无需提供created_at,updated_at如果您已经在数据库中设置了default该值。now()它将自动获取当前时间戳。
a = User.upsert({
name: ....,
age: ....,
created_at: Time.now,
updated_at:Time.now
}, nil, unique_by: :upsert_user_index )
Run Code Online (Sandbox Code Playgroud)
但如果你想插入一条记录,你应该使用createor save。它将触发验证和回调。如果您想跳过它们,您也可以这样做。upsert_all如果想要在单个 sql 中插入多个条目而不需要回调和验证,则应该使用。