Как я могу найти диапазон дат в 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())

Я хочу получить аналогичный запрос, но используя, где в активной записи.

Ответ 1

Вы не указали 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 с новыми методами видимости Arel:

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

Ответ 2

В Rails 3 вы можете использовать:

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

где start_date и end_date - класс Date.

Ответ 3

ActiveRecord может построить запрос, используя BETWEEN, когда он принимает Range. Похоже, это может быть больше того, что вы ищете.

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

Кажется, что это немного проще сделать, чем использовать >= <= в запросе

Ответ 4

Если я понял, вам нужно что-то вроде этого:

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