lib/preferences.rb in preferences-0.4.0 vs lib/preferences.rb in preferences-0.4.1
- old
+ new
@@ -49,19 +49,22 @@
# preferences are assumed to have a boolean data type, so all values will
# be typecasted to true/false based on ActiveRecord rules.
#
# Configuration options:
# * <tt>:default</tt> - The default value for the preference. Default is nil.
+ # * <tt>:group_defaults</tt> - Defines the default values to use for various
+ # groups. This should map group_name -> defaults. For ActiveRecord groups,
+ # use the class name.
#
# == Examples
#
# The example below shows the various ways to define a preference for a
# particular model.
#
# class User < ActiveRecord::Base
# preference :notifications, :default => false
- # preference :color, :string, :default => 'red'
+ # preference :color, :string, :default => 'red', :group_defaults => {:car => 'black'}
# preference :favorite_number, :integer
# preference :data, :any # Allows any data type to be stored
# end
#
# All preferences are also inherited by subclasses.
@@ -150,13 +153,10 @@
def preference(name, *args)
unless included_modules.include?(InstanceMethods)
class_inheritable_hash :preference_definitions
self.preference_definitions = {}
- class_inheritable_hash :default_preferences
- self.default_preferences = {}
-
has_many :stored_preferences, :as => :owner, :class_name => 'Preference'
after_save :update_preferences
# Named scopes
@@ -169,11 +169,10 @@
# Create the definition
name = name.to_s
definition = PreferenceDefinition.new(name, *args)
self.preference_definitions[name] = definition
- self.default_preferences[name] = definition.default_value
# Create short-hand accessor methods, making sure that the name
# is method-safe in terms of what characters are allowed
name = name.gsub(/[^A-Za-z0-9_-]/, '').underscore
@@ -247,15 +246,16 @@
end
result
end
preferences.each do |(group, preference), value|
+ group_id, group_type = Preference.split_group(group)
preference = preference.to_s
- value = preference_definitions[preference.to_s].type_cast(value)
- is_default = default_preferences[preference.to_s] == value
+ definition = preference_definitions[preference.to_s]
+ value = definition.type_cast(value)
+ is_default = definition.default_value(group_type) == value
- group_id, group_type = Preference.split_group(group)
table = "preferences_#{group_id}_#{group_type}_#{preference}"
# Since each preference is a different record, they need their own
# join so that the proper conditions can be set
joins << "LEFT JOIN preferences AS #{table} ON #{table}.owner_id = #{table_name}.#{primary_key} AND " + sanitize_sql(
@@ -301,23 +301,25 @@
#
# user.preferred_color = 'red', :cars
# user.preferences(:cars)
# => {"language=>"English", "color"=>"red"}
def preferences(group = nil)
+ preferences = preferences_group(group)
+
unless preferences_group_loaded?(group)
- preferences = preferences_group(group)
-
group_id, group_type = Preference.split_group(group)
find_preferences(:group_id => group_id, :group_type => group_type).each do |preference|
- preferences[preference.name] ||= preference.value
+ preferences[preference.name] = preference.value unless preferences.include?(preference.name)
end
# Add defaults
- preferences.reverse_merge!(self.class.default_preferences.dup)
+ preference_definitions.each do |name, definition|
+ preferences[name] = definition.default_value(group_type) unless preferences.include?(name)
+ end
end
- preferences_group(group).dup
+ preferences.dup
end
# Queries whether or not a value is present for the given preference.
# This is dependent on how the value is type-casted.
#
@@ -372,10 +374,10 @@
else
# Grab the first preference; if it doesn't exist, use the default value
group_id, group_type = Preference.split_group(group)
preference = find_preferences(:name => name, :group_id => group_id, :group_type => group_type).first unless preferences_group_loaded?(group)
- value = preference ? preference.value : preference_definitions[name].default_value
+ value = preference ? preference.value : preference_definitions[name].default_value(group_type)
preferences_group(group)[name] = value
end
definition = preference_definitions[name]
value = definition.type_cast(value) unless value.nil?