0

我有before_validation一个模型。其目的是计算两个DateTime对象之间的工作时间,并将该值插入到time_worked属性中。它的成功取决于两个字段的有效性,它吐出第三个字段的值,而第三个字段又具有验证。

class TimeEntry < ActiveRecord::Base
  validates :start_time, :end_time, :presence => true
  validates :time_worked, :presence => true, :numericality => true
  before_validation :calculate_time_worked

def calculate_time_worked
    time_float = (Time.parse(self.end_time.to_s) - Time.parse(self.start_time.to_s)) / 1.hour  
    self.time_worked = ((time_float * 10).ceil).to_f/10
end

问题是,如果其中一个为空或无效,我的方法calculate_time_worked将失败,这正是这两个字段具有验证的原因!start_timeend_time

任何想法如何重构?

4

2 回答 2

1

@PedroMedeiros 的 before_save 解决方案将在这种情况下工作....但如果您想验证 time_worked 是否为正,那么您可能会执行以下操作:

  validate :calculate_time_worked

  def calculate_time_worked
    return if end_time.blank? || start_time.blank?
    time_float = (Time.parse(self.end_time.to_s) - Time.parse(self.start_time.to_s)) / 1.hour  
    self.time_worked = ((time_float * 10).ceil).to_f/10
    if time_worked < 0
      self.errors.add(:end_time, "Must be after Start Time")
    end
  end

最后——这个 SO 问题很酷,能以小时为单位获得时间差

于 2012-06-21T19:36:00.620 回答
0

它看到 before_validates 在设置这些方法之前被调用。如果我在哪里,我会使用 before_save 来计算_time_worked。一旦设置了 attrs 并且您的验证将完成。

class TimeEntry < ActiveRecord::Base
  validates :start_time, :end_time, :presence => true
  validates :time_worked, :presence => true, :numericality => true
  before_save :calculate_time_worked

end
于 2012-06-21T19:27:03.343 回答