Как я могу искать диапазон дат в Rails с переменной датой - PullRequest
12 голосов
/ 12 марта 2011

Как я могу сделать это в активной записи на рельсах?что я пытаюсь сделать в активной записи в 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())

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

Ответы [ 4 ]

49 голосов
/ 01 апреля 2012

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

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

, где start_date и end_date - класс даты.

9 голосов
/ 15 ноября 2012

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

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

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

7 голосов
/ 12 марта 2011

Вы не указали 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) }
1 голос
/ 12 марта 2011

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...