Hattr
A simple library for interacting with the PSQL hstore extension in ActiveRecord. Hattr supports coercion of hstore attributes based on a simple dsl and will eventually support more advanced features such as Rails validations and more configurable options.
Basic Usage
Hattr was designed to be simple. All you need is to extend the Hattr module and start building your spec.
class Television < ActiveRecord::Base
extend Hattr
hattr :metadata, :weight, type: Float
hattr :metadata, :screen_class, type: Integer
endNow when you call metadata on your Television object, instead of getting an ugly hash back that looks like this:
{ "weight" => "35.6", "screen_class" => "55" }You can get back data that matches your specification - like this:
{ weight: 35.6, screen_class: 55 }Advanced Usage
While Hattr was designed to be simple, it was also meant to be flexible to many use cases.
Attribute Options
:type
Sets the type of the attribute which defaults to String if not specified. Valid values include String, Integer, Fixnum, Float, Symbol, Array, and Hash. Errors may be raised if coercion cannot be completed
class Person < ActiveRecord::Base
extend Hattr
hattr :metadata, :name # :type == String
endSuper advanced usage
For Array and Hash types, you can specify the types of the keys/values. For example, for an array of numbers and a hash of strings mapped to floats, you can do:
class Person < ActiveRecord::Base
extend Hattr
hattr :metadata, :array, type: Array[Fixnum]
hattr :metadata, :hash, type: Hash[String => Float]
endThe inner values are subject to inclusion in the list above for normal types.
NOT ADVANCED ENOUGH
Since it recursively calls typecast on the values of the array and values of the hash, you can do some pretty crazy stuff
class Person < ActiveRecord::Base
extend Hattr
hattr :metadata, :wtf, type: Hash[Symbol => Array[Hash[String => Hash[Symbol => Float]]]]
endAlso, in case you're curious, just plain Hash and Array in the "normal" types list map to Hash[Symbol => String] and Array[String] respectively behind the scenes.
Group Options
:string_keys
Leaves hash keys as strings instead of symbolizing them. Defaults to false if hattr_group is not called or :string_keys is not specified.
class Television < ActiveRecord::Base
extend Hattr
hattr_group :metadata, string_keys: true
hattr :metadata, :weight, type: Float
hattr :metadata, :screen_class, type: Integer
endMultiple Attributes
class Person < ActiveRecord::Base
extend Hattr
hattr :address, :line1, type: String
hattr :address, :line2, type: String
hattr :address, :zip, type: Integer
hattr :metadata, :age, type: Integer
hattr :metadata, :weight, type: Float
endContributing
I would like to add more options to attribute and group dealing with validation, but if you have an idea feel free to open an issue/pull request!
Installation
With RubyGems
To install Hattr with RubyGems:
gem install hattr
With Bundler
To use Hattr with a Bundler managed project:
gem 'hattr'
License
Released under the MIT license