2011-05-10 10 views

Respuesta

17

Desde "created_at" columna contiene la fecha y la hora, pero hay que comparar única fecha, tiene dos formas (supongo que utiliza MySQL):

  1. uso ENTRE:
    scope :today, lambda { WHERE("created_at BETWEEN '#{DateTime.now.beginning_of_day}' AND '#{DateTime.now.end_of_day}'") }
  2. uso DATE() función:
    scope :today, lambda { WHERE('DATE(created_at) = ?', Date.today)}

Además, puede agregar la columna "created_on" a la tabla con fecha solamente.

Actualizado:

def self.up 
    add_column table_name, :created_on, :date 
    add_column table_name, :updated_on, :date 
end 

scope :today, lambda { where(created_on: Date.today) }

+0

¿Cómo le digo a los raíles (rake) que crear un campo de solo fecha? – fabian

+0

Solo necesita agregar el campo "created_on" y "update_on" a la tabla. Estos nombres de columna son especiales, por lo que los valores serán configurados automáticamente por Rails. – BitOfUniverse

+0

Alcance final: alcance: hoy, lambda { donde ("created_on =?", Date.today) } – fabian

7

rieles evalúa el alcance a nivel de clase por lo que cuando se utiliza: condiciones => {: created_at => Date.today} Evalúa Date.today y comparar todos los registros con fecha de pre evaluado. Para evitar este uso lambda para definir de fecha u hora alcances específicos

scope :today, lambda { :conditions =>[ "created_at = ? ", Date.today] } 
+0

sintaxis, Tassoc inesperada, esperando '}' ... hoy, lambda {: condiciones => {: created_at => Date.today } ... – fabian

+0

fragmento de código editado ... pruébelo –

+0

Entendió el punto: la columna "created_at" contiene la fecha y la hora, pero necesito comparar solo la fecha (día, sin tiempo) – fabian

16

Creo que se puede definir un alcance general como esto:

class MyModel < ActiveRecord::Base 
    scope :created_on, lambda {|date| {:conditions => ['created_at >= ? AND created_at <= ?', date.beginning_of_day, date.end_of_day]}} 

    def self.today 
    self.created_on(Date.today) 
    end 
end 

esta manera puede utilizar

>> MyModel.today #-> records created today 
>> MyModel.created_on(Date.today - 1.week) #-> records created a week ago 
+0

Técnicamente, probablemente debería ser 'created_at> =? Y created_at <=? ', De lo contrario, ¡faltarán dos segundos! Además, en 'self.today', necesita' self.created _ ** on ** ', en lugar de' created _ ** at ** '. –

+0

i fijo '>' y '<' for '> =' y '<=' - que no queremos perder ninguna segundos;) Y, por supuesto, no debe created_on created_at - gracias por el comentario y correcciones! – santuxus

2

IMO esta es la forma más comprensible de hacerlo.

def self.created_today 
    where("created_at >= ? AND created_at < ?", Date.today, Date.tomorrow) 
    end 
1

Sé que es una vieja pregunta, pero aún puede ayudar a cualquier persona.

Esta fue mi manera de resolver esto: error

scope :today, -> { where(created_at: DateTime.now.beginning_of_day..DateTime.now.end_of_day) }

+0

Bien, gracias :) – matiss

Cuestiones relacionadas