需要帮助编写一种方法来计算 Model/Views 的持续时间(时间)?
Need help writing a method to calculate duration (time) for Model/Views?
我的 Rails 4 应用程序有一个约会 table,它有以下 attributes/columns:"date"(数据类型日期),"starts_at"(数据类型时间) 和 "ends_at"(时间数据类型)。我没有 "duration" 列,但想计算 "ends-at" 和 "starts-at" 时间之间的差异。我想要持续时间,所以我可以在约会模型中进行验证,以防止用户进行少于 30 分钟或超过 2 小时的约会。我使用 Google 来研究这个问题,但没有发现任何对我正在尝试做的事情特别有用的东西。我正在学习 Rails,并尝试获取最佳实践。我假设放置 "duration" 逻辑的地方在模型中,而不是在视图中。现在,我认为用户不需要查看持续时间数据。我开始为模型编写 "duration" 方法,但无法使逻辑正常工作。这是我到目前为止所做的:
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 语句,但没有成功。
问题:
我当前的代码有什么问题?
有没有更好的方法来解决这个问题来完成我的objective?
如果我稍后决定通过视图向用户呈现 "duration" 信息,我如何通过嵌入式 Ruby 代码来实现?
感谢任何帮助和建议!
以下是我可能会采用的方法:
添加右边的评论只是为了解释一些正在发生的事情。
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
的更多信息
如果您想稍后显示持续时间,我很可能会使用 presenter。但是您也可以只在该模型上创建一个实例方法。
# Public: get the duration of the appointment in minutes
#
def duration
(ends_at - starts_at) / 60
end
如果是这种情况,那么你可以对变量做一点重构
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
希望这对你有用。
我的 Rails 4 应用程序有一个约会 table,它有以下 attributes/columns:"date"(数据类型日期),"starts_at"(数据类型时间) 和 "ends_at"(时间数据类型)。我没有 "duration" 列,但想计算 "ends-at" 和 "starts-at" 时间之间的差异。我想要持续时间,所以我可以在约会模型中进行验证,以防止用户进行少于 30 分钟或超过 2 小时的约会。我使用 Google 来研究这个问题,但没有发现任何对我正在尝试做的事情特别有用的东西。我正在学习 Rails,并尝试获取最佳实践。我假设放置 "duration" 逻辑的地方在模型中,而不是在视图中。现在,我认为用户不需要查看持续时间数据。我开始为模型编写 "duration" 方法,但无法使逻辑正常工作。这是我到目前为止所做的:
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 语句,但没有成功。
问题:
我当前的代码有什么问题?
有没有更好的方法来解决这个问题来完成我的objective?
如果我稍后决定通过视图向用户呈现 "duration" 信息,我如何通过嵌入式 Ruby 代码来实现?
感谢任何帮助和建议!
以下是我可能会采用的方法:
添加右边的评论只是为了解释一些正在发生的事情。
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
的更多信息
如果您想稍后显示持续时间,我很可能会使用 presenter。但是您也可以只在该模型上创建一个实例方法。
# Public: get the duration of the appointment in minutes
#
def duration
(ends_at - starts_at) / 60
end
如果是这种情况,那么你可以对变量做一点重构
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
希望这对你有用。