Ir para conteúdo principal
Lucas Caton

My Favorite Rails Upgrade Strategy

Ditch the rake task and try this method instead

Lucas Caton

Lucas Caton

@lucascaton
Upgrading a Ruby on Rails app can be a daunting task, but I've found a strategy that works well, particularly for small to medium size projects.
Instead of using the rails app:update rake task, which is the approach recommended in the official Rails Guides, I prefer to generate a new app, for example with the following command:
bash
rails new --database postgresql --skip-test /tmp/my-app
# Use any other flag to make it as close as possible to the original app
Then, I replace all the files in the current repository with the new ones, except for the .git directory. After that, I compare the changes in each file and decide whether to keep or remove them based on whether they make sense for my project running on the new version of Rails.
One of the benefits of this approach is that it addresses all the necessary changes at once, rather than only updating the strictly required files like the rake task does.
The rake task will always create a config/initializers/new_framework_defaults_[old-version].rb file, which is frequently overlooked and left unmodified (until it causes problems or during the next upgrade), resulting in the app running on the new Rails version with some of the old version's defaults.
The strategy I use can be a bit more time-consuming (after all, you're ripping the whole upgrade steps off like a Band-Aid), but in my experience, it has resulted in fewer issues.
For example, I recently upgraded an app and realised that with the rake task approach, it didn't upgrade the app/models/application_record.rb file at all, while this method would have replaced:
diff
 class ApplicationRecord < ActiveRecord::Base
-  self.abstract_class = true
+  primary_abstract_class
 end
It's not a big deal but I'd like to have my app fully upgraded, almost like it was created using the rails new command from the latest Rails.
Overall, while both approaches can get the job done, I find that generating a new app and carefully comparing the changes is a more reliable strategy for upgrading a Rails app.