Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Allows the storage of a number of boolean fields with just one table column
Ruby
branch: master

This branch is 8 commits ahead, 3 commits behind brennandunn:master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
tasks
test
MIT-LICENSE
README
Rakefile
init.rb
install.rb
preference_fu.gemspec
uninstall.rb

README

PreferenceFuu
=============

This plugin, greatly inspired by Jim Morris' blog post (http://blog.wolfman.com/articles/2007/08/07/bit-vector-preferences), aims to make it easy and flexible to store boolean preferences for an ActiveRecord model. This can be also used as a very quick way to setup an ACL.

Because the values are stored within a bit vector, a virtually unlimited number of preferences can be created without additional migrations.
(for 32bit integer columns up to 32)

Feel free to email me with any suggestions or problems.

Blog: http://www.brennandunn.com
Email address: me@brennandunn.com

Modified by Martin Karlsch (martin@karlsch.com)

Setup
=====

Simply add an integer column to each table of the database that requires preferences. By default, the column used is 'preferences', but the column name can be modified by passing :column => 'new_name' to the has_preferences call.

To allow multiple preferences per model the option :accessor => 'some_name' can be passed. If :column was not specified the column name to use is derived from the value given to accessor. 

schema like this:
	
	add_column :people, :preferences, :integer
		

Examples
========

Using PreferenceFu is very simple.

	class User < ActiveRecord::Base
	
		has_preferences :send_email, :change_theme, :delete_user, :create_user,
		                :default => { :send_mail => true }
		
		has_preferences :birthday, :holiday, :party,
		                :accessor => 'reminders'
	
	end
	
For new AR objects, all preference options will be set to false. This can be overwritten using set_default_preference. I really recommend you read the 'Warning' section below.

Setting a key:
	...individually
	@user.preferences[:delete_user] = true 
		
	...mass assignment (useful with the params hash)
	@user.preferences = {:delete_user => true, :create_user => true}
	
Setting an option as true doesn't necessarily need to be done with the Boolean true - in fact, the Fixnum 1, and strings '1', 'y' and 'yes' are all valid. This is particularly helpful for checkbox form posts.

 	@user.preferences[:create_user] = 'yes'


Fetching a key:
	@user.preferences[:change_theme]  => false
	@user.preferences.change_theme? => false
	@user.reminders.birthday? => false

Getting the index of a key:
	@user.reminders.index(:party)  => 4
	

Enumerable...
	@user.preferences.size  => 4
	
	@user.preferences.each do |key, value|
		puts "#{key} is set to #{value}"
	end
	

Warning
=======

This works by taking the index of the splat supplied in has_preferences as the power of two, summing all values, and storing the sum in the preferences column. Because of this, the first item in the splat will be identified by 1, the second by 2, the third by 4, etc. Once you start using PreferenceFu in production, add new options to the *end* of the splat. At the moment, there's no safe way to delete a preference item at the moment. Any advice is welcome! 


Copyright (c) 2008 Brennan Dunn, released under the MIT license
Modifications Copyright (c) 2008 Martin Karlsch, released under the MIT license
Something went wrong with that request. Please try again.