Ruby或Rails找到“从现在起两个月”的记录

时间:2015-11-02 18:49:25

标签: ruby-on-rails ruby date date-range

我正在尝试查找给定月份中距离“现在”大约2个月的所有记录 - 现在是任务运行的时间。例如......如果任务在2月1日运行,它应该会发现所有记录在4月到期。但是,如果任务在2月4日运行,它也应该只找到4月份到期的所有记录(包括4月1日,2日,3日等)。

我可以使下面的查询工作(我正在为此任务设置每月的cron作业)....除了在11月或12月运行时它不起作用。

def expiring_soon 

future_date = Date.today + 30.days
first_date = Date.new(future_date.year, future_date.month, 1)
last_date = Date.new(future_date.year, future_date.month + 1.month) - 1.day
@expiring = SampleRecord.expires_between(first_date, last_date)

我觉得必须有更好的方法......我正在使用Rails 4和Postgres

3 个答案:

答案 0 :(得分:3)

您可以将以下scope添加到您的模型中:

scope :expiring_soon, -> {
  date = Date.today >> 1
  where(expires_at: (date.beginning_of_month..date.end_of_month))
}

然后像这样调用范围:

YourModel.expiring_soon

您可能希望阅读Rails中的Date/Time calculationsRange queries (see 2.3.2)

答案 1 :(得分:0)

好像你会想要这样的东西。使用inline void Params2(unsigned char c) { //do something with char } inline void Params2(char c) { //do something with uchar } inline void Params2(unsigned short c) { //do something with short } inline void Params2(short c) { //do something with ushort } template<typename T> void Params2(const std::list<T>& value) { // list } template<typename T, typename ...TArgs> void Params2(T value, TArgs... args) { Params2(value); Params2(args...); } 作为template<typename T> struct helper; template<> struct helper<unsigned char> { void operator () (unsigned char c) { /**/}}; template<> struct helper<char> { void operator () (char c) { /**/}}; template<typename T> struct helper<std::list<T>> { void operator () (const std::list<T>& l) { /**/}}; template<typename T> void Params2(const T& t) { helper<T>{}(t); }

的起点
first_date

答案 2 :(得分:0)

请注意,run_at模型中有Job字段,expires_at模型中有SampleRecord字段。因此,对于特定的job,您可以执行以下操作:

SampleRecord.where("expires_at BETWEEN ? AND ?", job.run_at, job.run_at + 2.months)