Dy-na-bix, tasty serialization attribute accessors for ActiveRecord
Presenting Dynabix. Dynabix is an ActiveRecord 3.x RubyGem that facilitates attribute serialization via dynamically created read/write accessors.
Data serialization is a technique that can be used to persist data to the database without changing the schema when adding or removing attributes. A single text field can contain multiple attributes. Serialization is useful for one-off situations like voting polls or frequently changing on-line questionnaires. Dynabix uses ActiveRecord's serialize method under the hood.
ActiveRecord as of 3.2.1, as pointed out in the comments, has a very similar native method store. Dynabix differs from store by providing a declarative DSL for defining multiple stores (Ruby 1.9+), has separate read/write accessors, and stores to the database as HashWithIndifferentAccess. Unless you need one of these specific features, using the native 'store' method is recommended.
Dynabix's source is available under the MIT license here https://github.com/robertwahler/dynabix. The documentation is located on Rubydoc.info at http://rubydoc.info/gems/dynabix
Add a text column "metadata" to your model migration. This column will store all the attribute values defined by Dynabix.
class AddMetadataToThings < ActiveRecord::Migration def change add_column :things, :metadata, :text end end
Add accessors to your model using the default column name ":metadata", specify the attributes in a separate step.
class Thing < ActiveRecord::Base has_metadata # full accessors metadata_accessor :breakfast_food, :wheat_products, :needs_milk # read-only accessor metadata_reader :friends_with_spoons end
Specifying attributes for full attribute accessors in one step
class Thing < ActiveRecord::Base has_metadata :metadata, :breakfast_food, :wheat_products, :needs_milk end
Using the new accessors
thing = Thing.new thing.breakfast_food = 'a wheat like cereal" # same thing, but using the metadata hash directly thing.metadata[:breakfast_food] = 'a wheat like cereal"
Dynabix under Ruby 1.9+ enables specifying multiple metadata columns on a model. You are not limited to using the static "metadata" column.
Add text columns "cows" and "chickens" to your "thing" model migration
class AddMetadataToThings < ActiveRecord::Migration def change add_column :things, :cows, :text add_column :things, :chickens, :text end end
Specifying multiple metadata serializers to segregate like data into separate database columns (Ruby 1.9 only)
class Thing < ActiveRecord::Base has_metadata :cows has_metadata :chickens, :tasty, :feather_count # read-only cows_reader :likes_milk, :hates_eggs # write-only cows_writer :no_wheat_products # extra full accessors for chickens chickens_accessor :color, :likes_eggs, :egg_count end
Using the new accessors
thing = Thing.new # cow stuff thing.no_wheat_products = true # chicken stuff thing.likes_eggs = true thing.egg_count = 12 # using the metadata hash directly to read the data since # we only created a write accessor thing.cows[:no_wheat_products].should be_true
Add Dynabix to your Gemfile
gem "dynabix"
Install the gem with Bundler
bundle install
Get the source
cd workspace
git clone https://github.com/robertwahler/dynabix.git
cd dynabix
Install the dependencies
bundle install
Run the specs
bundle exec rake spec
Autotest with Guard
bundle exec guard
article comments powered by Disqus
Copyright 1999-2013, GearheadForHire, LLC
Site design by GearheadForHire, LLC | v2.3.0