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.
Available as a gem:
gem install acts-as-optionable
This creates an Option model in you app.
-
script/generate option
-
rake db:migrate
class Style < ActiveRecord::Base acts_as_optionable end
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"
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"
style.instance_specified_options = { :foo => {:default => "FOO"} } style.get_option("foo").value => "FOO"
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
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.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"
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.
-
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