2011-03-12 59 views
11

如何在rails活动记录中执行此操作?如何在带有可变日期的Rails中搜索日期范围

找到匹配(created_at +100天内对该月之间),所有车型

编辑: 好了,对不起,不准确这是我想要的活动记录,以做的Rails 3.0的方式:

select 
    distinct p.ID 
from 
    patients p 
    inner join vaccines_patients vp on p.ID = vp.patient_id 
    inner join vaccines v on v.ID = vp.VACCINE_ID 
where 
    month(vp.appliedAt + INTERVAL v.duration DAY) = month(now()) 

我想得到一个类似的查询,但使用在活动记录中的位置。

回答

7

你没有指定Rails 2或3,我不完全确定你真正在寻找什么范围,但这应该让你开始。请添加一些示例日期并说明它们是否应该落入您的范围内。

在Rails 2中,您可以在模型中使用named_scope。

# This range represents "created_at" values that are within 100 days on either side of today. 
# Please clarify what "created_at + 100 days between this month" means if you need help 
# refining this. 
# 
named_scope :within_range, lambda {{ :conditions => ["created_at <= ? AND created_at >= ?", Date.today + 100, Date.today - 100] }} 

在Rails 3,你可以使用一个scope新阿雷尔范围的方法:

scope :within_range, lambda { where("created_at <= ? AND created_at >= ?", Date.today + 100, Date.today - 100) } 
+0

啊,伟大的使用>=<=。谢谢布兰登。 – jdl 2011-03-12 19:46:36

1

如果我的理解,你需要的东西是这样的:

date = Date.today 
after = date.start_of_month - 100 
before = date.end_of_month - 100 

YourModel.find(:all, :conditions => ['created_at > ? AND created_at < ?', after, before]) 

或范围(导轨2):

# shorter name is needed 
named_scope :created_100_days_before_this_month, lambda do |date| 
    after = date.start_of_month - 100 
    before = date.end_of_month - 100 
    YourModel.find(:all, :conditions => ['created_at > ? AND created_at < ?', after, before]) 
end 
46

在Rails 3,您可以使用:

YourModel.where(:created_at => start_date..end_date) 

其中start_dateend_date是Date类。

+2

这不包括在end_date上为我创建的任何记录。 – ckarbass 2012-09-10 23:14:32

+2

然后你只需要多加一天,对吧? – 2012-09-16 18:11:27

+2

是的,我认为这是因为没有时间的日期被解释为当天的午夜,因此,在该日期期间的任何时间被认为是在该范围之外。所以是的,再多加一天。 – adamwong246 2013-06-11 23:39:22

7

ActiveRecord可以在接受Range时使用BETWEEN建立查询。这听起来像它可能更多你正在寻找。

YourModel.where(created_at: 100.days.ago..100.days.from_now)

它似乎总是一点点简单的做到这一点比在查询