【问题标题】:Update the database with new values after a migration迁移后使用新值更新数据库
【发布时间】:2025-11-29 07:45:02
【问题描述】:

我的数据库中有一个名为sessions 的表,其中包含两列(start_timeend_time),并且我的表中已经有很多数据。然后我生成了一个迁移:

$ rails g migration AddDurationToSessions duration:integer 

我的模型session.rb 看起来像这样:

class Session < ActiveRecord::Base
   before_save :calc_duration

   def calc_duration
     return self[:end_time] - self[:start_time]
   end
end

我的问题是:如何将calc_duration 应用于表中的所有旧元素?我是手动更新它们还是有最佳实践?

【问题讨论】:

    标签: ruby-on-rails dbmigrate


    【解决方案1】:

    你可以在迁移中做到这一点:

    class AddDurationToSessions < ActiveRecord::Migration
      def change
        add_column :sessions, :duration, :integer
    
        # Find and update all older session record
        Session.find_each do |s|
          # new duration
          calc_duration = s.end_time - s.start_time
          # update session with new duration
          s.update(duration: calc_duration.to_i)
        end
    
      end
    end
    

    【讨论】:

    • 在 Rails 中编码一年多后,我了解到在迁移中不要使用类方法,而是使用 SQL 语句。这样做的原因是因为方法可以更改(在执行迁移之后),从而使迁移不可用。另请阅读this