No commit activity in last 3 years
No release in over 3 years
Add options to ActiveRecord models. I don't advise using this yet, as it's very alpha.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies
 Project Readme

ActsAsOptionable¶ ↑

Warning I don’t recommend using this yet since I’m going to make a couple core changes shortly. Very alpha.

Support to add options, as well as specify default options, to ActiveRecord models. It’s currently a very basic approach, and allows you to fetch options from an ActiveRecord model via an association, or via a hash or object where options are callable as methods. It doesn’t support any advanced finder options.

It works by creating an options table which is polymorphic to ActiveRecord models which call acts_as_optionable.

The plugin also grants the ability to specify default options for a class, or pass in defaults to an instance at runtime.

Installation¶ ↑

Available as a gem:

gem install acts-as-optionable

Post Installation¶ ↑

This creates an Option model in you app.

  1. script/generate option

  2. rake db:migrate

Usage¶ ↑

Adding options to a model¶ ↑

class Style < ActiveRecord::Base
  acts_as_optionable
end

Setting, getting, and deleting options¶ ↑

Use #get_option, #set_option, and #delete_option for interacting with options.

style = Style.create
style.set_option("color", "red")
style.get_option("color").value => "red"
style.delete_option("color")
style.get_option("color") => nil

You can also store an optional “kind” attribute as a hint to what you are storing:

style.set_option("bgcolor", "white", :kind => "color")
style.get_option("bgcolor").kind => "color"

Add a “category” if you want to group options:

style.set_option("bgcolor", "white", :category => "colors")
style.get_option("bgcolor").category => "colors"

You can also store an optional display name for human consumption:

style.set_option("bgcolor", "white", :display_name => "Background Color")
style.get_option("bgcolor").display_name => "Background Color"

Specifying default options at the class level¶ ↑

class StyleWithDefaults < ActiveRecord::Base
  acts_as_optionable

  specify_option :background_color, :default => "white", :kind => "color", :category => "background"
  specify_option :color, :default => "black"
end

style = StyleWithDefaults.create
style.get_option("background_color").value => "white"
style.get_option("background_color").kind => "color"
style.get_option("background_color").category => "background"

Specifying instance options at runtime¶ ↑

style.instance_specified_options = { :foo => {:default => "FOO"} }
style.get_option("foo").value => "FOO"

Persisting options specific to a record¶ ↑

You can persist numeric, boolean, or string values for storage.

style.set_option("color", "red")
style.get_option("color").value => "red"

style.set_option("active", false)
style.get_option("active").value => false

style.set_option("max_time", 3600)
style.get_option("max_time").value => 3600

Option precedence¶ ↑

Options are preferred in the following order:

  1. Stored options specific for this record

  2. Runtime options provided to the instance

  3. Class options specified at load time.

Example:

class StyleWithDefaults < ActiveRecord::Base
  acts_as_optionable

  specify_option :background_color, :default => "white"
  specify_option :color, :default => "black"
end

style = StyleWithDefaults.create
style.instance_specified_options = { :color => { :default => "green" } }
style.get_option("background_color").value => "white"
style.get_option("color").value => "green"
style.set_option("color", "blue")
style.get_option("color").value => "blue"

Easy options and values retrieval¶ ↑

Use #options_values_struct to grab a struct to allow for method based calls for all default and set options:

style = StyleWithDefaults.create
options = style.options_values_struct
options.color => "black"

This is useful, for instance, for passing a set of options into a liquid template.

TODO¶ ↑

  • Thinking about finding a way to optionally associate the option with an asset table. This would be useful for allowing user defined stylesheet options referencing S3 assets.

  • Add in a way to return an option value straight away.

  • Assign multiple settings at a time.

Copyright © 2010 Brendon Murphy, released under the MIT license