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
挂钩在对象已保存且数据库事务已结束后运行。它对很多场景都非常有用,但它不是你现在要找的。
您好,我有一个名为持续时间(整数)的计算时间字段,我试图在创建持续时间计算后将其保存到我的数据库中,这样我就可以做一些进一步的计算,例如计算全天的会议时间。我的问题是如何将“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
挂钩在对象已保存且数据库事务已结束后运行。它对很多场景都非常有用,但它不是你现在要找的。