vendor/plugins/refinery_settings/app/models/refinery_setting.rb in refinerycms-0.9.6.14 vs vendor/plugins/refinery_settings/app/models/refinery_setting.rb in refinerycms-0.9.6.15

- old
+ new

@@ -2,24 +2,35 @@ validates_presence_of :name validates_uniqueness_of :name serialize :value # stores into YAML format - + after_save do |object| + cache_write(object.name, object.value) + end + + def self.cache_write(name, value) + Rails.cache.write("refinery_setting_#{name}", value) + end + + def self.cache_read(name) + Rails.cache.read("refinery_setting_#{name}") + end + # Number of settings to show per page when using will_paginate def self.per_page 10 end - + # prettier version of the name. # site_name becomes Site Name def title self.name.titleize end # Access method that allows dot notation to work. - # say you had a setting called "site_name". You could access that by going RefinerySetting[:site_name] + # Say you had a setting called "site_name". You could access that by going RefinerySetting[:site_name] # but with this you can also access that by going RefinerySettting.site_name def self.method_missing(method, *args) method_name = method.to_s super(method, *args) @@ -30,48 +41,67 @@ self[method_name] end end def self.find_or_set(name, the_value) - setting = find_or_create_by_name(:name => name.to_s, :value => the_value) - setting.value + # Try to get the value from cache first. + unless (value = cache_read(name)).present? + # Either find the record or create one with the defined value + value = find_or_create_by_name(:name => name.to_s, :value => the_value).value + # Cache it + cache_write(name, value) + end + + # Return what we found. + value end def self.[](name) - self.find_by_name(name.to_s).value rescue nil + # Try to get the value from cache first. + unless (value = cache_read(name)).present? + # Not found in cache, try to find the record + value = if (setting = self.find_by_name(name.to_s)).present? + # Cache it + cache_write(name, setting.value) + else + # Still cache the nil to prevent more lookups to find nothing. + cache_write(name, nil) + end + end + + # Return what we found. + value end def self.[]=(name, value) setting = find_or_create_by_name(name.to_s) setting.value = value setting.save! end - - # Below is not very nice, but seems to be required # The problem is when Rails serialises a fields like booleans # it doesn't retreieve it back out as a boolean # it just returns a string. This code maps the two boolean # values correctly so a boolean is returned REPLACEMENTS = {"true" => true, "false" => false} def value current_value = self[:value] - unless current_value.nil? + if current_value.present? # This bit handles true and false so that true and false are actually returned # not "0" and "1" REPLACEMENTS.each do |current, new_value| current_value = new_value if current_value == current end # converts the serialised value back to an integer # if the value is an integer begin if current_value.to_i.to_s == current_value - current_value = current_value.to_i + current_value = current_value.to_i end rescue current_value end end @@ -83,6 +113,6 @@ # must convert to string if true or false supplied otherwise it becomes 0 or 1, unfortunately. new_value = new_value.to_s if ["trueclass","falseclass"].include?(new_value.class.to_s.downcase) self[:value] = new_value end -end \ No newline at end of file +end