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.
-
script/generate option
-
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. = { :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:
-
Stored options specific for this record
-
Runtime options provided to the instance
-
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. = { :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
= style.
.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