Report abuse


			
module DateWithOptionalTime
  module ActiveRecord
    module Base

      def self.included(base)
        base.extend(ClassMethods)
      end

      module ClassMethods
        def date_with_optional_time(*args)
          class_eval do
            args.each do |a|
              a = a.to_s

              define_method "#{a}_time_obj" do
                send "#{a}_time"
              end

              define_method "#{a}_date_obj" do
                send "#{a}_date"
              end

              define_method(a+"_time_display") do
                hours = (send(a+"_time_obj") / 100).floor
                minutes = send(a+"_time_obj") - (hours * 100)
                sprintf('%02d:%02d', hours, minutes)
              end

              define_method(a+"_time_display=") do |value|
                send(a+"_time_will_change!") if send(a+"_time_obj") == 0 && value.blank?
                send(a+"_time=", value.split(':').join)
              end

              define_method(a+"_datetime") do
                if send(a+"_date_obj")
                  dt_arr = [send(a+"_date_obj").year, send(a+"_date_obj").month, send(a+"_date_obj").day]
                  time = send(a+"_time_obj") || 0
                  hours = (time / 100).floor
                  minutes = time - (hours * 100)
                  dt_arr += [hours,minutes]
                  DateTime.new(*dt_arr)
                end
              end
            end
          end
        end
      end
    end
  end
end