I like to keep my Active Record models as strict as possible but I also like the further layer of protection/restriction setting database columns to not allow NULL adds. Normalizing to nil helps enforce this better by not letting ’’ slip through the cracks and I can still prevent those who insist on direct DB access from entering in shitty data as much as possible.
The traditional way../script/plugin install git://github.com/mdeering/attribute_normalizer.git
or the old-school but still c00l way!piston import git://github.com/mdeering/attribute_normalizer.git vendor/plugins/attribute_normalizer
or for all you hip gitsters.git submodule add git://github.com/mdeering/attribute_normalizer.git vendor/plugins/attribute_normalizer git submodule init
This is eager loaded into Active Record.
class Klass < ActiveRecord::Base # Can take an array of attributes if you want normalize_attributes :first_name, :last_name normalize_attributes :home_phone_number, :office_phone_number_ do |value| return nil unless value.is_a?(String) value.gsub(/\W/, '').gsub(/^1/, '') end end object = Klass.new # Blank normalizes to nil object.first_name = '' object.first_name # => nil # Whitespace is cleaned up object.last_name = "\tDeering\n" object.last_name # => 'Deering' # Your given block will be executed to normalize object.home_phone_number = '+1 (555) 123.4567' object.home_phone_number # => '5551234567'
Original module code and concept was taken from Dan Kubb during a project we worked on together. I found that I was consistently using this across all my projects so I wanted to plugin-er-size and gem this up for easy reuse.