如何搜索日期数组以确定一个或多个是否适合定义的范围



我试图解决的问题是确定用户上个月是否创建了"提示"。此检查将在用户创建新提示后完成。

我有一组名为"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

相关内容

最新更新