ref: master
app/models/concerns/split_datetime.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
module SplitDatetime class << self def nil_time Time.parse "#{Time.now.hour}:0:0" end def nil_date Date.today end def to_time datetime datetime = self.nil_time if datetime.blank? datetime.to_formatted_s :time end def to_date datetime datetime = self.nil_date if datetime.blank? datetime.strftime '%d/%m/%Y' end def set_time datetime, value value = if value.blank? self.nil_time elsif value.kind_of? String Time.parse value else value.to_time end datetime = self.nil_date if datetime.blank? Time.mktime(datetime.year, datetime.month, datetime.day, value.hour, value.min, value.sec).to_datetime end def set_date datetime, value value = if value.blank? self.nil_date elsif value.kind_of? String DateTime.strptime value, '%d/%m/%Y' else value.to_time end datetime = nil_time if datetime.blank? Time.mktime(value.year, value.month, value.day, datetime.hour, datetime.min, datetime.sec).to_datetime end end module SplitMethods def split_datetime attr define_method "#{attr}_time" do datetime = send attr SplitDatetime.to_time datetime end define_method "#{attr}_date" do datetime = send attr SplitDatetime.to_date datetime end define_method "#{attr}_time=" do |value| datetime = send attr send "#{attr}=", SplitDatetime.set_time(datetime, value) end define_method "#{attr}_date=" do |value| datetime = send attr send "#{attr}=", SplitDatetime.set_date(datetime, value) end end end end Class.extend SplitDatetime::SplitMethods ActiveRecord::Base.extend SplitDatetime::SplitMethods |