2011-03-12 77 views
11

¿Cómo puedo hacer esto en el registro activo de carriles¿?¿Cómo puedo buscar el rango de fechas en Rails con fecha variable

encontrar todos los modelos que responden a created_at (+ 100 días entre este mes)

Editar: Ok, Lo siento por no ser precisos esto lo que yo estoy tratando de hacer en el registro activo en Rails 3.0 manera:

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()) 

Deseo obtener una consulta similar pero usando el lugar en el registro activo.

Respuesta

7

No especificó los Rails 2 o 3, y no estoy del todo seguro del rango que realmente está buscando, pero esto debería ayudarlo a comenzar. Agregue algunas fechas de ejemplo y diga si deberían caer dentro de su rango o no.

En Rails 2 puede usar un named_scope en su modelo.

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

En Rails 3, se utilizaría un scope con los nuevos métodos de alcance Arel:

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

Ah, muy bien. Gracias Brandon. – jdl

1

Si he entendido bien, se necesita algo como esto:

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]) 

o en su alcance (carriles 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

En Rails 3 se puede utilizar:

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

donde start_date y end_date son de clase Fecha.

+2

esto no incluye ningún registro creado en end_date para mí. – ckarbass

+2

Entonces solo agrega 1 día adicional, ¿verdad? –

+2

Sí, creo que es porque una Fecha sin hora se interpreta como la medianoche del día de, por lo tanto, en cualquier momento durante esa fecha se considera fuera del rango. Entonces sí, agrega un día más. – adamwong246

7

ActiveRecord puede generar una consulta utilizando un BETWEEN cuando acepta un Range. Parece que podría ser más de lo que estás buscando.

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

siempre parece un poco más simple de hacerlo que usando >=<= en la consulta

Cuestiones relacionadas