Rails after_commit 回调无法将计算保存到数据库中的持续时间列

Rails after_commit callback cant save calculation to duration column in database

您好,我有一个名为持续时间(整数)的计算时间字段,我试图在创建持续时间计算后将其保存到我的数据库中,这样我就可以做一些进一步的计算,例如计算全天的会议时间。我的问题是如何将“after_commit 回调”实现到我的代码中,我尝试过的任何内容都不会保存到数据库中? ..请帮助我

meetings.rb

def

duration (end_time - start_time).to_i

end

mettings_helper.rb

def duration_display(meeting)

duration = ActiveSupport::Duration.build(meeting.duration).parts format('%02d hours and %02d minutes', (duration[:hours]||0), (duration[:minutes]||0), (duration[:seconds]||0))

end

meetings/index.html

<td><%= duration_display meeting %></td>

数据库table

create_table "meetings", force: :cascade do |t|
    t.string "name"
    t.datetime "start_time"
    t.datetime "end_time"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "duration"
  end

您的 Meeting 模型应如下所示:

class Meeting < ApplicationRecord
  # This will guarantee set_duration is called before saving it to the database
  before_save :set_duration

  def set_duration
    self.duration = (end_time - start_time).to_i
  end
end

在这里您可以看到所有 available callbacks 以及 Rails 调用它们的正确顺序。

您需要使用 before_save,因为它在对象保存到数据库之前和验证之后立即运行,如您在上面的 link 中所见。

为什么不 运行 after_commit

after_commit 挂钩在对象已保存且数据库事务已结束后运行。它对很多场景都非常有用,但它不是你现在要找的。