Ruby on rails 如何在具有可变日期的Rails中搜索日期范围

Ruby on rails 如何在具有可变日期的Rails中搜索日期范围,ruby-on-rails,date,activerecord,Ruby On Rails,Date,Activerecord,如何在rails活动记录中执行此操作 查找所有匹配的模型(在本月之间+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

如何在rails活动记录中执行此操作

查找所有匹配的模型(在本月之间+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())

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

您没有指定Rails 2或3,我也不完全确定您实际要查找的范围,但这应该可以让您开始。请添加一些示例日期,并说明它们是否应属于您的范围

在Rails 2中,您可以在模型中使用命名的_范围

# 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] }}

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

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])
date=date.today
之后=日期。开始月份的日期-100
before=月底日期-100
查找(:all,:conditions=>['created_at>?和created_at<?',after,before])
或在范围内(rails 2):

#需要较短的名称
命名范围:在本月(lambda do)日期前100天创建|
之后=日期。开始月份的日期-100
before=月底日期-100
查找(:all,:conditions=>['created_at>?和created_at<?',after,before])
结束

在Rails 3中,您可以使用:

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

其中
start\u date
end\u date
是日期类。

ActiveRecord
在接受
范围时,可以使用
之间的
构建查询。这听起来可能更符合你的要求

YourModel.where(创建时间:100.days.ago..100.days.from\u now)


这样做似乎总是比使用
=
简单一点啊,太好了。谢谢你,布兰登。这不包括在结束日期为我创建的任何记录。是的,我认为这是因为没有时间的日期被解释为午夜,因此,该日期内的任何时间都被视为超出范围。所以,是的,再加上一天。一个有..的范围。。不包括最后一项,但包含。。。应该这样。尝试开始日期…结束日期,看看是否works@FredrikBränström实际上正好相反,
从开始到结束运行,包括,
排除结束值。该问题可能与其他人提到的一样,需要是
结束日期。结束日期
结束日期+1
。来源:哦,对不起。这不是很直观。。。它是?
# 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
YourModel.where(:created_at => start_date..end_date)