需要帮助编写一个方法来计算模型/视图的持续时间(时间)?

时间:2015-01-11 07:50:28

标签: ruby-on-rails ruby validation methods models

My Rails 4应用程序有一个约会表,它具有以下属性/列:“date”(数据类型日期),“starts_at”(数据类型时间)和“ends_at”(数据类型时间)。我没有“持续时间”列,但想要计算“结束时间”和“开始时间”时间之间的差异。我想要持续时间,所以我可以在约会模型中进行验证,以防止用户在不到30分钟或超过2小时内进行预约。我用Google来研究这个问题,但没有发现任何对我正在尝试做的事情特别有用的东西。我正在学习Rails,并尝试学习最佳实践。我假设放置“持续时间”逻辑的地方在模型中,而不是视图。现在,我不相信用户需要查看持续时间数据。我开始为模型编写“持续时间”方法,但无法使逻辑正常工作。这是我到目前为止所做的:

protected

  def duration
    (self.ends_at - self.starts_at).to_i
  end

我用以下方法调用方法:

validate :duration, numericality: {greater_than: 30, less_than: 120}

当我执行代码时,它不会产生任何错误,但验证似乎没有做任何事情。用户仍可以预约不到30分钟或超过2小时。我需要防止两种情况都存储在数据库中。我在方法中玩了一些if和else语句,但没有成功。

问题:

  1. 我目前的代码出了什么问题?

  2. 有没有更好的方法来解决问题以实现我的目标?

  3. 如果我稍后决定通过视图向用户提供“持续时间”信息,我如何通过嵌入式Ruby代码实现这一点?

  4. 我感谢任何帮助和建议!

1 个答案:

答案 0 :(得分:1)

这是我可能采取的方法:

添加右边的评论只是为了解释发生了什么。

validate :duration

private

def duration
  length = (ends_at - starts_at) / 60
  return if length.between?(30, 120) # bail out of validation if length falls between the two integers

 errors.add(:base, 'Your error message') # you can change this to something like `:ends_at` if it's preferable..
end

有关comparables in Ruby

的更多信息

如果您想稍后提出持续时间,我很可能会选择使用presenter的路线。但您也可以在该模型上创建一个实例方法。

# Public: get the duration of the appointment in minutes
#
def duration
  (ends_at - starts_at) / 60
end

如果是这种情况,那么你可以对valiation进行一些重构

validate :correct_duration

private

def correct_duration
  length = self.duration
  return if length.between?(30, 120) # bail out of validation if length falls between the two integers

 errors.add(:base, 'Your error message') # you can change this to something like `:ends_at` if it's preferable..
end

希望这适用于你。