Project

hattr

0.0
No commit activity in last 3 years
No release in over 3 years
A translation for the string centric hstore extension
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 10.5.0
~> 3.4.0
>= 0

Runtime

 Project Readme

Hattr

Build Status Gem Version Coverage Status

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
end

Now 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
end

Super 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]
end

The 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]]]]
end

Also, 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
end

Multiple 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
end

Contributing

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