【问题标题】:execute before_validation between other validations?在其他验证之间执行 before_validation?
【发布时间】:2012-06-24 02:36:06
【问题描述】:

我的模型中有一个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

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

任何想法如何重构?

【问题讨论】:

    标签: ruby-on-rails validation


    【解决方案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 问题在 getting the difference of time in hours 上很酷

    【讨论】:

      【解决方案2】:

      它看到 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
      

      【讨论】:

        猜你喜欢
        • 2021-05-08
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 1970-01-01
        相关资源
        最近更新 更多