Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
kind of a bridge between using AR and a full blown schema-free db
branch: fix_stringish_…

This branch is even with technoweenie:fix_stringish_booleans

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
gemfiles
lib
script
test
.gitignore
.travis.yml
LICENSE
README.md
Rakefile
init.rb
rails_init.rb
serializable_attributes.gemspec

README.md

SerializedAttributes

SerializedAttributes allows you to add an encoded hash to an ActiveRecord model.
This is similar to the built-in ActiveRecord serialization, except that the field is converted to JSON, gzipped, and stored in a BLOB field. This uses the json gem which is much faster than YAML serialization. However, JSON is not nearly as flexible, so you're stuck with strings/integers/dates/etc.

Where possible, ActiveRecord compatible methods are generated so that a migration should be pretty simple. See unit tests for examples.

Some of the code and most of the ideas are taken from Heresy, a ruby implementation of how FriendFeed uses MySQL for schema-free storage.

Supports ActiveRecord 2.2 in ruby 1.8.7, and ActiveRecord 2.3-3.1 in ruby 1.9.3. See Travis CI to see if we support your version of ActiveRecord and ruby.

Setup

Install the plugin into your Rails app.

Usage

class Profile < ActiveRecord::Base
  # assumes #data serializes to raw_data blob field
  serialize_attributes do
    string  :title, :description
    integer :age
    float   :rank, :percentage
    time    :birthday
  end

  # Serializes #data to assumed raw_data blob field
  serialize_attributes :data do
    string  :title, :description
    integer :age
    float   :rank, :percentage
    time    :birthday
  end

  # set the blob field
  serialize_attributes :data, :blob => :serialized_field do
    string  :title, :description
    integer :age
    float   :rank, :percentage
    time    :birthday
  end
end
Something went wrong with that request. Please try again.