2009-02-02 22 views

Respuesta

11

configurar un ámbito llamado:

named_scope :in_last_month, :conditions => [ "records.created_at > ?", 1.month.ago ] 

llamarlo (en su controlador):

Record.in_last_month 
+0

Es posible que desee agregar que necesita agregar una columna created_at; de lo contrario, Rails no se auto-poblará por usted. – Otto

+1

El created_at debe incluirse en una migración predeterminada que agrega "timestamps" automáticamente. También tenga en cuenta que lo que mostré aquí para el named_scope debe estar encerrado en una lambda como alguien muy bien anotado a continuación ... –

+0

Esta respuesta no funciona en Rails 4. Consulte la respuesta a continuación para el uso de Rails 4: http://stackoverflow.com/ a/29904961/336920 –

0

¿Tiene los campos "habituales" en su tabla? Vea el RoR wiki para obtener una lista de ellos. De esta manera, puede expresar consultas especiales para encontrar una respuesta.

2

Suponiendo que sus registros son sellos de tiempo, sólo se puede hacer algo como esto:

Thing.find(:all, :conditions => ["created_at > ?", Time.now - 1.month]) 

Si no están indicación de la hora, usted debe comenzar a almacenar la información, ya que es algo que tendrá que buscar más tarde.

+0

Alternativamente, usted puede hacer 1.month.ago que es lo mismo que Time.now - 1.month. –

0
Thing.find(:all, :conditions => ["created_at > ?", 1.month.ago.at_beginning_of_month]) 
1

Gracias a todos, terminamos yendo con esto:

find(:all, :conditions => ['created_at > ? AND created_at < ?', Date.today.last_month.beginning_of_month, Date.today.beginning_of_month]) 
10

El named_scope es una rata Creo que es su manera elegante de ir, pero si toma esa ruta, querrá usarla con un método lambda para que no se alcance el tiempo cuando la aplicación se carga inicialmente.

Por ejemplo, esto:

named_scope :last_month, :conditions => 
    ['created_at > ? AND created_at < ?', 
    Date.today.last_month.beginning_of_month, Date.today.beginning_of_month] 

funcionará correctamente el primer mes de su aplicación se ha terminado, pero inadecuadamente el próximo mes, a menos que la aplicación se reinicia.

Pero esto:

named_scope :last_month, lambda { 
    {:conditions => ['created_at > ? AND created_at < ?', 
    Date.today.last_month.beginning_of_month, Date.today.beginning_of_month]}} 

funcionará cada vez, ya que el método lambda es ejecutado en cada llamada, reevaluar los Date.today s.

0

No tengo suficiente reputación para votar aún, pero tenga en cuenta el comentario que menciona el uso de lambdas en named_scopes. Hay un episodio Railscasts sobre el tema que debe ser útil, así:

http://railscasts.com/episodes/108

0

este es un buen candidato para de SQL ENTRE sintaxis

named_scope :last_month, :conditions => ['created_at BETWEEN ? AND ?', Date.today.last_month.beginning_of_month, Date.today.beginning_of_month]) 
1

En uno de mis proyectos i utilizado este manera:

Thing.where('created_at BETWEEN ? AND ? ', DateTime.now.beginning_of_month - 1.month, DateTime.now.beginning_of_month) 

en Rails 3 utilizando last_month arroja un error: Date.today.last_month.beginning_of_month

NoMethodError: undefined method `last_month'

1

La respuesta aceptada y la mejora de lambda no funcionan en Rails 4.

Actualización para Rieles 4:

scope :last_month, -> { 
    where('created_at > ? AND created_at < ?', 
      Date.today.last_month.beginning_of_month, 
      Date.today.beginning_of_month)} 
Cuestiones relacionadas