在rails模型中使用日期时间对象

时间:2011-09-14 06:21:39

标签: ruby-on-rails datetime

我的模型中有两列,start_time和end_time。

生成这个模型的视图有一个很酷的日期日历和一个漂亮的时间选择器,但我无法弄清楚如何使这更优雅。我希望能够将我的表单中的日期和时间存储在数据库中而不会出现这些问题,Rails必须有更好的方法,对吗?

我想出了这个解决方案,每次看到它都会让我感到恶心。关于如何让这个更漂亮的任何想法?

attr_accessor :start_time_time, :end_time_time, :start_time_date, :end_time_date

def start_time_date
  self.start_time.try(:strftime,DATE_FORMAT)
end

def end_time_date
  self.end_time.try(:strftime, DATE_FORMAT)
end

def start_time_time
  self.start_time.try(:strftime, TIME_FORMAT)
end

def end_time_time
  self.end_time.try(:strftime, TIME_FORMAT)
end

def start_time_date=(date)
  begin
    self.start_time = nil
    self.start_time = Time.zone.parse("#{Date.strptime(date, DATE_FORMAT).to_formatted_s(:db)} #{start_time_time}") unless date.blank?
  rescue
    errors.add(:start_time_date)
  end
end

def end_time_date=(date)
  begin
    self.end_time = nil
    self.end_time = Time.zone.parse("#{Date.strptime(date, DATE_FORMAT).to_formatted_s(:db)} #{end_time_time}") unless date.blank?
  rescue
    errors.add(:end_time_date)
  end
end

def start_time_time=(time)
  begin
    self.start_time = Time.zone.parse("#{Date.strptime(start_time_date, DATE_FORMAT).to_formatted_s(:db)} #{time}") unless start_time_date.blank? or time.blank?
  rescue
    errors.add(:start_time_time)
  end
end

def end_time_time=(time)
  begin  
    self.end_time = Time.zone.parse("#{Date.strptime(end_time_date, DATE_FORMAT).to_formatted_s(:db)} #{time}") unless end_time_date.blank? or time.blank?
  rescue
    errors.add(:end_time_time)
  end
end

1 个答案:

答案 0 :(得分:0)

我使用Timepicker addon by Trent一次完成上述操作您可以通过执行start_time.to_time并调用to_date实例方法来操作DateTime对象。您根本不需要设置任何上述访问者。

我建议您使用Ryan watch this screencast,注意他的UI选择器中的日期信息是如何通过#create动作保存的。当您使用Timepicker插件时,您也可以定义时间,并且DateTime将适当地更新日期和时间信息。