Sha256: 89375a15bc30403c71aa8957e1fb5b00f4b4b9127a9daa0039d348eb544dfff9

Contents?: true

Size: 1.87 KB

Versions: 2

Compression:

Stored size: 1.87 KB

Contents

module HasSetting
  module InstanceMethods
    def write_setting(name, value)
      setting = self.settings.find_or_initialize_by_name(name)
      setting.value = value
      setting.save
      # reload so the getters work on the up-to-date collection
      settings.reload
    end
    
    def read_setting(name)
      # use detect instead of SQL find. like this the 'cached' has_many-collection is inited 
      # only once
      self.settings.detect() {|item| item.name == name }
    end
  end
  
  module ClassMethods
    def self.extended(extender)
      extender.class_eval do
        # AR association to settings
        has_many(:settings, :as => :owner, :class_name => 'HasSetting::Setting', :foreign_key => :owner_id)
        # a hash where we can store options for the settings
        write_inheritable_attribute(:has_setting_options, {})
        class_inheritable_reader(:has_setting_options)
      end
    end
    

    
    #
    # Setup of the getter/setter
    def has_setting(name, options = {})
      options[:type] ||= :string
      name = name.to_s
      raise ArgumentError.new("Setting name must not be blank") if name.blank?
      has_setting_options[name] = options
      
      define_method("#{name}=".intern) do |value|
        value = value.nil? ? nil : value.to_s 
        write_setting("#{self.class.name}.#{name}", value)
      end
      
      # getter
      define_method(name) do |*args| 
        setting = read_setting("#{self.class.name}.#{name}")
        return nil if setting.nil?
        
        options = args.first || has_setting_options[name]
        case options[:type]
          when :string : setting.value
          when :int : setting.value.blank? ? nil : setting.value.to_i
          when :float : setting.value.blank? ? nil : setting.value.to_f
          else raise ArgumentError.new("Unsupported type: #{options[:type]}")
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
simplificator-has_setting-0.1.1 lib/has_setting/ar_extensions.rb
simplificator-has_setting-0.1.2 lib/has_setting/ar_extensions.rb