StoreModel alternatives and similar gems
Based on the "ORM/ODM Extensions" category
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest. Visit our partner's website for more details.
Do you think we are missing an alternative of StoreModel or a related project?
StoreModel gem allows you to wrap JSON-backed DB 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
- 1️⃣ Follows single responsibility principle. Keep 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 (
📖 Read more about the motivation in the Wrapping JSON-based ActiveRecord attributes with classes post
Start with creating a class for representing the hash as an object:
class Configuration include StoreModel::Model attribute :model, :string attribute :color, :string end
Attributes should be defined using Rails Attributes API. There is a number of types available out of the box, and you can always extend the type system.
Register the field in the ActiveRecord model class:
class Product < ApplicationRecord attribute :configuration, Configuration.to_type end
When you're done, the initial snippet could be rewritten in the following way:
product = Product.find(params[:id]) if product.configuration.model == "spaceship" product.configuration.color = "red" end product.save
- StoreModel::Model API:
- [Nested models](./docs/nested_models.md)
- [Unknown attributes](./docs/unknown_attributes.md)
- [Array of stored models](./docs/array_of_stored_models.md)
- [One of](./docs/one_of.md)
- [Defining custom types](./docs/defining_custom_types.md)
The gem is available as open source under the terms of the MIT License.
*Note that all licence references and agreements mentioned in the StoreModel README section above are relevant to that project's source code only.