StoreModel

Services & Skills

Share on

The StoreModel Ruby gem allows you to wrap JSON-backed database columns with ActiveModel-like classes.

  • Powered with Attributes API. You can use a number of familiar types or write your own.
  • Works like ActiveModel. Validations, enums and nested attributes work very similar to APIs provided by Rails.
  • Follows single responsibility principle. Keeps the logic around the data stored in a JSON column separated from the model.
  • Born in production.
class Configuration
  include StoreModel::Model

  attribute :model, :string
  enum :status, %i[active archived], default: :active

  validates :model, :status, presence: true
end

class Product < ApplicationRecord
  attribute :configuration, Configuration.to_type
end

Why should I wrap my JSON columns?

Imagine that you have a model Product with a jsonb column called configuration. This is how you likely gonna work with this column:

product = Product.find(params[:id])
if product.configuration["model"] == "spaceship"
  product.configuration["color"] = "red"
end
product.save

This approach works fine when you don’t have a lot of keys with logic around them and just read the data. However, when you start working with that data more intensively—you may find the code a bit verbose and error-prone.

For instance, try to find a way to validate :model value to be required. Despite of the fact, that you’ll have to write this validation by hand, it violates single-repsponsibility principle: why parent model (Product) should know about the logic related to a child (Configuration)?

Read more about the motivation:

Author

Further reading

In the same orbit

Explore more OSS projects

Contact us

We’d love to hear from you! We’re not really all that evil, and we love discussing potential projects, intriguing ideas, and new opportunities. Complete the form below or drop us a line at surrender@evilmartians.com.

Martians at a glance
16
years in business

A product development consultancy that works with startups and established businesses, while also creating open source-based products and services