首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助编写计算模型/视图持续时间(时间)的方法吗?

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

Stack Overflow用户
提问于 2015-01-11 07:50:27
回答 1查看 252关注 0票数 0

我的Rails 4应用程序有一个约会表,它有以下属性/列:"date“(数据类型日期)、"starts_at”(数据类型时间)和"ends_at“(数据类型时间)。我没有“持续时间”列,但希望计算“结束-at”和“开始-在”时间之间的差异。我想要持续时间,这样我就可以在约会模型中进行验证,以防止用户预约时间少于30分钟或超过2小时。我用谷歌来研究这个问题,但没有发现对我想做的事情有什么特别的帮助。我正在学习Rails,并尝试学习最佳实践。我假设将“持续时间”逻辑放在模型中,而不是视图中。现在,我不认为用户需要看到持续时间数据。我开始为模型编写一个“持续时间”方法,但无法使逻辑正常工作。以下是我迄今所做的工作:

代码语言:javascript
复制
protected

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

我使用以下方法调用该方法:

代码语言:javascript
复制
validate :duration, numericality: {greater_than: 30, less_than: 120}

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

问题:

  1. 我现在的密码怎么了?
  2. 有什么更好的方法来解决这个问题来实现我的目标呢?
  3. 如果我以后决定通过视图向用户提供“持续时间”信息,我如何通过嵌入式Ruby代码实现这一点?

我感谢任何帮助和建议!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-11 08:53:02

以下是我可能会采取的方法:

右方的评论只是为了解释一下正在发生的事情。

代码语言:javascript
复制
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

关于Ruby的可比较性的更多信息

如果您想稍后介绍持续时间,我很可能会使用演示者。但是你也可以在这个模型上创建一个实例方法。

代码语言:javascript
复制
# Public: get the duration of the appointment in minutes
#
def duration
  (ends_at - starts_at) / 60
end

如果是这样的话,那么您可以对验证做一些重构。

代码语言:javascript
复制
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

希望这对你有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27885067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档