If you have a large number of settings/preferences on your model (like a company or a businesss) and you store each preference in a separate model or in separate columns on the model itself, it gets hairy, quickly.
Additionally you require those settings/preferences to be read in from a form and then you need an easy way to validate them too.
Personally, I found that putting settings in the database relationally was hellish.
SerialPreference stores preferences serialized in a hash in your model. All in one place with a DSL to define your settings along with validations and other niceties.
Scratching my own itch.
Add this line to your application's Gemfile:
gem 'serial_preference'
And then execute:
$ bundle
Or install it yourself as:
$ gem install serial_preference
class Company < ActiveRecord::Base
include SerialPreference::HasSerialPreferences
preferences do
preference :taxable data_type: :boolean, required: true
preference :vat_no required: false
preference :max_invoice_items data_type: :integer
float :rate_of_interest
# default data type is :string
# if the preference is required, then a validation is added to the model
# if the data type is numerical, then a numericality validation is added
# preferences can be grouped in preference groups
preference_group "Preferred Ledgers" do
income_ledger_id data_type: :integer, default: 1
end
password field_type: :password
end
end
- Fetching Preference/Groups
# something you can customize in your form perhaps?
Company.preference_groups.each do |pg| # => returns an array of preference groups
# pg.name => Name of Preference Group as specified in map e.g. Preferred Ledgers
# pg.preferences => Array of Preference Definitions
pg.preferences.each do |preference|
# preference => PreferenceDefinition
f.input preference.name, required: preference.required?, placeholder: preference.default, as: preference.field_type
end
end
# List of Preferences
Company.preference_names # => [:income_ledger_id]
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request