module TimestampSuperFunctions::TimestampModelConcern

Public Class Methods

add_timestamp_helper_functions(list) click to toggle source
# File app/models/concerns/timestamp_super_functions/timestamp_model_concern.rb, line 7
def self.add_timestamp_helper_functions(list)
  list.uniq.collect(&:to_s).each{|method_name|
    
    if method_name.ends_with?("_at")
      # boolean setting timestamp as now, e.g contract_signed = true => contract_signed_at = Time.now
      define_method "#{method_name[0...(method_name.length - 3)]}=" do |val|
          if val == "true" || val == 1  || val == "1" || val == true
            self.send("#{method_name}=", Time.now) if self.send(method_name).nil?
          else
            self.send("#{method_name}=", nil)
          end
      end
      
      # boolean for presence, e.g contract_signed? => !contract_signed_at.nil?
      define_method "#{method_name[0...(method_name.length - 3)]}?" do
          !self.send(method_name).nil?
      end
      
      define_method "#{method_name[0...(method_name.length - 3)]}" do
          !self.send(method_name).nil?
      end
      
      # boolean for presence, e.g not_contract_signed? => contract_signed_at.nil?
      define_method "not_#{method_name[0...(method_name.length - 3)]}?" do
          self.send(method_name).nil?
      end
      
      define_method "not_#{method_name[0...(method_name.length - 3)]}" do
          self.send(method_name).nil?
      end

      #scopes e.g Contract.contract_signed => where("contract_signed_at is not null")
      self.class.send(:define_method, "#{method_name[0...(method_name.length - 3)]}") do
        where("#{self.table_name}.#{method_name} is not null")
      end
      self.class.send(:define_method, "not_#{method_name[0...(method_name.length - 3)]}") do
        where("#{self.table_name}.#{method_name} is null")
      end
      
    end
  }
end