我试图解决的问题是确定用户上个月是否创建了"提示"。此检查将在用户创建新提示后完成。
我有一组名为"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
确实,随着数组变大,此功能会变慢。您应该考虑将提示存储在数据库中的单独表中,方法是为每个提示设置一条记录并按日期查询它们。这样会快得多。
您可以在此处阅读有关关联的更多信息:
http://guides.rubyonrails.org/association_basics.html