Rails Upsert PG created_at 问题

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)


Cha*_*rma 5

无需提供created_atupdated_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 中插入多个条目而不需要回调和验证,则应该使用。