我正在尝试查找给定月份中距离“现在”大约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
答案 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 calculations和Range 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)