Module: Preferences::InstanceMethods
- Defined in:
- lib/preferences.rb
Class Method Summary collapse
-
.included(base) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#preferences(*args) ⇒ Object
Finds all preferences, including defaults, for the current record.
-
#preferred(name, group = nil) ⇒ Object
(also: #prefers)
Gets the actual value stored for the given preference, or the default value if nothing is present.
-
#preferred?(name, group = nil) ⇒ Boolean
(also: #prefers?)
Queries whether or not a value is present for the given preference.
-
#set_preference(name, value, group = nil) ⇒ Object
Sets a new value for the given preference.
Class Method Details
.included(base) ⇒ Object
:nodoc:
165 166 167 168 169 |
# File 'lib/preferences.rb', line 165 def self.included(base) #:nodoc: base.class_eval do alias_method :prefs, :preferences end end |
Instance Method Details
#preferences(*args) ⇒ Object
Finds all preferences, including defaults, for the current record. If any custom group preferences have been stored, then this will include all default preferences within that particular group.
Examples
A user with no stored values:
user = User.find(:first)
user.preferences
=> {"language"=>"English", "color"=>nil}
A user with stored values for a particular group:
user.preferred_color = 'red', 'cars'
user.preferences
=> {"language"=>"English", "color"=>nil, "cars"=>{"language=>"English", "color"=>"red"}}
Getting preference values just for the owning record (i.e. excluding groups):
user.preferences(nil)
=> {"language"=>"English", "color"=>nil}
Getting preference values for a particular group:
user.preferences('cars')
=> {"language"=>"English", "color"=>"red"}
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/preferences.rb', line 198 def preferences(*args) if args.empty? group = nil conditions = {} else group = args.first # Split the actual group into its different parts (id/type) in case # a record is passed in group_id, group_type = Preference.split_group(group) conditions = {:group_id => group_id, :group_type => group_type} end # Find all of the stored preferences stored_preferences = self.stored_preferences.find(:all, :conditions => conditions) # Hashify name -> value or group -> name -> value stored_preferences.inject(self.class.default_preferences.dup) do |all_preferences, preference| if !group && (preference_group = preference.group) preferences = all_preferences[preference_group] ||= self.class.default_preferences.dup else preferences = all_preferences end preferences[preference.name] = preference.value all_preferences end end |
#preferred(name, group = nil) ⇒ Object Also known as: prefers
Gets the actual value stored for the given preference, or the default value if nothing is present.
Examples
class User < ActiveRecord::Base
preference :color, :string, :default => 'red'
end
user = User.create
user.preferred(:color) # => "red"
user.preferred(:color, 'cars') # => "red"
user.preferred(:color, Car.first) # => "red"
user.set_preference(:color, 'blue')
user.preferred(:color) # => "blue"
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'lib/preferences.rb', line 269 def preferred(name, group = nil) name = name.to_s if @preference_values && @preference_values[group] && @preference_values[group].include?(name) # Value for this group/name has been written, but not saved yet: # grab from the pending values value = @preference_values[group][name] else # Split the group being filtered group_id, group_type = Preference.split_group(group) # Grab the first preference; if it doesn't exist, use the default value preference = stored_preferences.find(:first, :conditions => {:name => name, :group_id => group_id, :group_type => group_type}) value = preference ? preference.value : preference_definitions[name].default_value end value end |
#preferred?(name, group = nil) ⇒ Boolean Also known as: prefers?
Queries whether or not a value is present for the given preference. This is dependent on how the value is type-casted.
Examples
class User < ActiveRecord::Base
preference :color, :string, :default => 'red'
end
user = User.create
user.preferred(:color) # => "red"
user.preferred?(:color) # => true
user.preferred?(:color, 'cars') # => true
user.preferred?(:color, Car.first) # => true
user.set_preference(:color, nil)
user.preferred(:color) # => nil
user.preferred?(:color) # => false
245 246 247 248 249 250 |
# File 'lib/preferences.rb', line 245 def preferred?(name, group = nil) name = name.to_s value = preferred(name, group) preference_definitions[name].query(value) end |
#set_preference(name, value, group = nil) ⇒ Object
Sets a new value for the given preference. The actual Preference record is not created until this record is saved. In this way, preferences act exactly the same as attributes. They can be written to and validated against, but won’t actually be written to the database until the record is saved.
Examples
user = User.find(:first)
user.set_preference(:color, 'red') # => "red"
user.save!
user.set_preference(:color, 'blue', Car.first) # => "blue"
user.save!
303 304 305 306 307 308 309 310 311 |
# File 'lib/preferences.rb', line 303 def set_preference(name, value, group = nil) name = name.to_s @preference_values ||= {} @preference_values[group] ||= {} @preference_values[group][name] = value value end |