Properties for Rails

Ruby gem to handle properties for ActiveRecord instances by storing them as serialized Hash in a separate database table. Namespaces and defaults included.

Requirements

  • Ruby 1.9.3 or newer
  • Rails 3.1 or newer (including Rails 5.2)

Installation

Include the gem in your Gemfile and run bundle to install it:

gem 'rails-properties'

Generate and run the migration:

rails g rails_properties:migration
rake db:migrate

Usage

Define properties

class User < ActiveRecord::Base
  has_properties do |s|
    s.key :dashboard, :defaults => { :theme => 'blue', :view => 'monthly', :filter => false }
    s.key :calendar,  :defaults => { :scope => 'company'}
  end
end

If no defaults are needed, a simplified syntax can be used:

class User < ActiveRecord::Base
  has_properties :dashboard, :calendar
end

Every property is handled by the class RailsProperties::PropertyObject. You can use your own class, e.g. for validations:

class Project < ActiveRecord::Base
  has_properties :info, :class_name => 'ProjectPropertyObject'
end

class ProjectPropertyObject < RailsProperties::PropertyObject
  validate do
    unless self.owner_name.present? && self.owner_name.is_a?(String)
      errors.add(:base, "Owner name is missing")
    end
  end
end

Set properties

user = User.find(1)
user.properties(:dashboard).theme = 'black'
user.properties(:calendar).scope = 'all'
user.properties(:calendar).display = 'daily'
user.save! # saves new or changed properties, too

or

user = User.find(1)
user.properties(:dashboard).update_attributes! :theme => 'black'
user.properties(:calendar).update_attributes! :scope => 'all', :display => 'daily'

Get properties

user = User.find(1)
user.properties(:dashboard).theme
# => 'black

user.properties(:dashboard).view
# => 'monthly'  (it's the default)

user.properties(:calendar).scope
# => 'all'

Delete properties

user = User.find(1)
user.properties(:dashboard).update_attributes! :theme => nil

user.properties(:dashboard).view = nil
user.properties(:dashboard).save!

Using scopes

User.with_properties
# => all users having any property

User.without_properties
# => all users without having any property

User.with_properties_for(:calendar)
# => all users having a property for 'calender'

User.without_properties_for(:calendar)
# => all users without having properties for 'calendar'

Eager Loading

User.includes(:property_objects)
# => Eager load property_objects when querying many users

License

MIT License

Copyright (c) 2012-2018 Georg Ledermann

This gem is a rename of rails-settings by Georg Ledermann