class ChangeDatesToDatetimes < ActiveRecord::Migration[5.2] def self.up change_column :todos, :show_from, :datetime change_column :todos, :due, :datetime change_column :recurring_todos, :start_from, :datetime change_column :recurring_todos, :end_date, :datetime User.includes(:todos, :recurring_todos).each do |user| if !user.prefs ## ugly hack for strange edge-case of not having preferences object user.instance_eval do def at_midnight(date) return Time.zone.local(date.year, date.month, date.day, 0, 0, 0) end def time Time.zone.now end end end user.todos.each do |todo| todo[:show_from] = user.at_midnight(todo.show_from) unless todo.show_from.nil? todo[:due] = user.at_midnight(todo.due) unless todo.due.nil? todo.save_with_validation(false) end user.recurring_todos.each do |todo| todo[:start_from] = user.at_midnight(todo.start_from) unless todo.start_from.nil? todo[:end_date] = user.at_midnight(todo.end_date) unless todo.end_date.nil? todo.save_with_validation(false) end end end def self.down change_column :todos, :show_from, :date change_column :todos, :due, :date change_column :recurring_todos, :start_from, :date change_column :recurring_todos, :end_date, :date end end