diff --git a/lib/preferences/preference_definition.rb b/lib/preferences/preference_definition.rb index b27ae26..a404a8c 100644 --- a/lib/preferences/preference_definition.rb +++ b/lib/preferences/preference_definition.rb @@ -2,47 +2,41 @@ module Preferences # Represents the definition of a preference for a particular model class PreferenceDefinition # The data type for the content stored in this preference type - attr_reader :type - + attr_reader :type, :name + def initialize(name, *args) #:nodoc: options = args.extract_options! options.assert_valid_keys(:default, :group_defaults) - - @type = args.first ? args.first.to_sym : :boolean - - @klass = "ActiveRecord::Type::#{@type.to_s.classify}".constantize.new - # Create a column that will be responsible for typecasting - @column = ActiveRecord::ConnectionAdapters::Column.new(name.to_s, options[:default], @type == :any ? nil : @klass) + + type = args.first ? args.first.to_sym : :boolean + type = :string if @type == :any + + @type = ActiveRecord::Type.lookup(type) + @name = name + @default = options[:default] @group_defaults = (options[:group_defaults] || {}).inject({}) do |defaults, (group, default)| defaults[group.is_a?(Symbol) ? group.to_s : group] = type_cast(default) defaults end end - - # The name of the preference - def name - @column.name - end - + # The default value to use for the preference in case none have been # previously defined def default_value(group = nil) - @group_defaults.include?(group) ? @group_defaults[group] : @column.default + @group_defaults.include?(group) ? @group_defaults[group] : @default end - + # Determines whether column backing this preference stores numberic values def number? - @column.number? + @type.is_a?(ActiveRecord::Type::Integer) end - + # Typecasts the value based on the type of preference that was defined. - # This uses ActiveRecord's typecast functionality so the same rules for - # typecasting a model's columns apply here. def type_cast(value) - @type == :any ? value : @column.type_cast_from_database(value) + @type.deserialize(value) end - + # Typecasts the value to true/false depending on the type of preference def query(value) if !(value = type_cast(value))