2009-05-21 8 views
1

J'ai ces deux lignes dans mon modèle, écrit pour PostgreSQL:Rails: Rendre cette requête agnostique à la base de données ...?

named_scope :by_month, lambda { |month| { :conditions => ["EXTRACT(MONTH FROM recorded_on) = ?", month] }} 
named_scope :by_year, lambda { |year| { :conditions => ["EXTRACT(YEAR FROM recorded_on) = ?", year] }} 

Je cours PostgreSQL dans la production, mais je développe avec SQLite3. Comment puis-je écrire ces lignes d'une manière indépendante de la base de données?

BTW, "recorded_on" est formé à partir de ce qui suit:

Model.recorded_on = Time.parse("Fri, 01 May 2009 08:42:23 -0400") 

Répondre

3

D'accord, trouvé il y a une meilleure façon (grâce à this article):

font fondamentalement rien dans le modèle!

date = Date.new(year, month, 1) 
Model.find(:all, :conditions => { :recorded_on => date..date.end_of_month }) 
0

ENTRE devrait être assez universelle: que diriez-vous quelque chose comme ceci:

named_scope :by_month, lambda { |month| 
    d1 = Date.new(2009, month, 1) 
    d2 = d1.end_of_month 
    { :conditions => ['recorded_on between ? and ?', d1, d2]} 
    } 

    named_scope :by_year, lambda { |year| 
    d1 = Date.new(year, 1, 1) 
    d2 = d1.end_of_year 
    { :conditions => ['recorded_on between ? and ?', d1, d2]} 
    } 

Si vous avez du temps, vous auriez besoin pour obtenir un peu plus intelligent avec les heures, minutes et secondes.

+0

Essayé ce dans le script/console et je reçois cette erreur: ActiveRecord :: StatementInvalid: PGError: ERREUR: la colonne "report_run_date" n'existe pas ?? – neezer

+0

Oups - a laissé mon propre nom de colonne dans le code de test. Fixé. Cela a fonctionné magnifiquement sur * ma * table cependant ... ;-) –

Questions connexes