2009-02-02 9 views

Répondre

11

Mettre en place un champ nommé:

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

Pour l'appeler (dans votre contrôleur):

Record.in_last_month 
+0

Vous voudrez peut-être ajouter que vous devez ajouter une colonne created_at, sinon Rails ne le remplira pas automatiquement. – Otto

+1

created_at doit être inclus dans une migration par défaut qui ajoute automatiquement des "horodatages". Notez également que ce que j'ai montré ici pour le named_scope devrait être inclus dans un lambda comme quelqu'un bien noté ci-dessous ... –

+0

Cette réponse ne fonctionne pas dans Rails 4. Voir la réponse ci-dessous pour l'utilisation de Rails 4: http://stackoverflow.com/ a/29904961/336920 –

0

Avez-vous les champs "habituels" sur votre table? Voir le RoR wiki pour une liste d'entre eux. De cette façon, vous pouvez exprimer des requêtes spéciales pour trouver une réponse.

2

En supposant que vos dossiers sont horodatées, vous pouvez simplement faire quelque chose comme ceci:

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

Si elles ne sont pas horodatées, vous devriez commencer à stocker les informations car il est quelque chose que vous aurez envie de regarder plus tard.

+0

Sinon, vous pouvez faire 1.month.ago qui est la même chose que Time.now - 1.month. –

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

Merci tout le monde, je fini par aller avec ceci:

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

Le named_scope est un rat Je pense que c'est une façon élégante d'y aller, mais si vous prenez cette route, vous voudrez l'utiliser avec une méthode lambda afin que le temps ne soit pas compris lorsque l'application est initialement chargée.

Par exemple, ceci:

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

fonctionnera correctement le premier mois de votre demande est, mais de manière incorrecte le mois prochain, à moins que l'application se redémarrée.

Mais ceci:

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

fonctionnera chaque fois, parce que la méthode lambda est exécuté à chaque appel, les réévaluant Date.today s.

0

Je n'ai pas assez de réputation pour voter encore, mais veuillez prendre note du commentaire qui mentionne l'utilisation de lambdas dans named_scopes. Il y a un épisode Railscasts sur le sujet qui devrait être utile aussi bien:

http://railscasts.com/episodes/108

0

c'est un bon candidat pour SQL ENTRE syntaxe

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

Dans l'un de mes projets j'ai utilisé cette ainsi:

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

dans Rails 3 en utilisant last_month renvoie une erreur: Date.today.last_month.beginning_of_month

NoMethodError: undefined method `last_month'

1

La réponse acceptée et l'amélioration lambda ne fonctionnent pas dans Rails 4.

Mise à jour pour Rails 4:

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