我试图解决的问题是确定用户上个月是否创建了“提示”。此检查将在用户创建新提示后完成。
我有一个名为“tip_dates”的用户过去小费日期的字符串数组。我当前使用 rails 的解决方案遍历该数组中的每个值,将其转换为日期,并检查它是否在该月内。
这是最有效的解决方案吗?我担心随着日期数组变大,此检查可能需要很多时间。
def tip_last_month
start_date = Date.today.beginning_of_month - 1.month
end_date = start_date.end_of_month
for tip_date in self.tip_dates do
if tip_date.to_date.between?(start_date, end_date)
return true
end
end
return false
end
Ruby 人员并没有真正在函数的末尾使用for
显式的return
-s。默认情况下将返回最后一个表达式的值。
我在这里做的是,我通过将字符串映射到日期对象然后将它们传递给一个any?
块来创建一个数组,该块将在第一次匹配时返回 true 或如果没有则返回 false。
def tip_last_month
start_date = Date.today.beginning_of_month - 1.month
end_date = start_date.end_of_month
tip_dates.map(&:to_date).any? do |date|
date.between?(start_date, end_date)
end
end
确实,随着数组变大,这个函数会变慢。您应该考虑将数据库中的提示存储在一个单独的表中,为每个提示设置一条记录并按日期查询它们。这样会快很多。
您可以在此处阅读有关关联的更多信息:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句