Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
7 Patterns to Refactor Rails Models 7 years later #rails #model #refactor #valueobject #serviceobject #formobject #queryobject #viewobject #policyobject #decorator

7 Patterns to Refactor Rails Models 7 years later

You may have read the following excellent blogpost by Brian Helmkamp of CodeClimate. It nicely describes 7 types of objects that can be extracted from models and controllers in a Rails-app.

7 Patterns to Refactor Fat ActiveRecord Models Brian Helmkamp on Oct 17, 2012.

Here are my thoughts on it, reading it as an experienced rails developer, 7 years later 😅 👴

Don’t Extract Mixins from Fat Models

Be careful about extracting code into app/model/concerns.

Any application with an app/concerns directory is concerning. :thinking_face: I've heard that quote before, probably repeated on an episode of Ruby Rogues.

1. Extract Value Objects

We need to practise this more @standout projects.

2. Extract Service Objects

These are often put in app/services and are pretty common. The name is not the best.

3. Extract Form Objects

These days you can use include ActiveModel::Model` to make it easier. Check out the "Form Objects in Rails" blogpost by Chris Jeon

4. Extract Query Objects

When scope isn't enough.

5. Introduce View Objects

Helpers are terribly global. You can't really have private methods since including a module in ruby will expose all its methods even if they're private. And by default all helpers are available everywhere 🙀.

How about view objects then, do they solve the problem? Yes I think so. But where should they be put? Everything needs to have it's place 📚. Maybe app/view_models.

6. Extract Policy Objects

The gem pundit by Varvet is very popular for this, at least within my bubble @standout.

7. Extract Decorators

As Dan Croak of thoughtbot concluded in Evaluating Alternative Decorator Implementations In Ruby.

  1. Start by wrapping an object with a plain old ruby object
  2. If you need a transparent interface you can reach for SimpleDelegator and friends
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment