2010-03-15 7 views
0

J'ai un modèle (Dépense) qui contient des champs comme 'coût'.Trouver des entrées appartenant au mois en cours (ou d'autres mois)

Je voudrais parcourir toutes mes dépenses pour trouver la somme du coût de toutes les entrées appartenant à un mois donné.

Existe-t-il un moyen de le faire directement dans les rails?

Expense.find (: all,: conditions => .....)

+1

http://meta.stackexchange.com/questions/23321/is-it-appropriate-to-comment-on-peoples-accept-rate/23326# 23326 – anshul

Répondre

1

somme/group_by:

Expense.find(:all, 
      :select => "SUM(cost) as cost_sum, MONTH(date) as month, YEAR(date) as year", 
      :group => "MONTH(date), YEAR(date)") 
+0

Euh ... Je viens de tester ça et ça semble aller très bien dans ruby ​​1.9.1/rails 2.3.5. 'Expense.find (: all,: select =>" SOM (coût) comme coût_sum, MONTH (date) comme mois, YEAR (date) comme année ",: group =>" MONTH (date), YEAR (date) ") .map {| x | met "# {x.year} _ # {x.month} - # {x.cost_sum}"} ' Bien sûr, votre solution est plus linéaire, mais juste pour l'exhaustivité, celle-ci fonctionne aussi. – anshul

+0

Merci votre code m'a aidé maintenant sur le futur =) –

5

Pour obtenir la somme des coûts pour le mois d'une date donnée:

# date = any day of the month of intrest 
    Expense.sum(:cost, :conditions => {:created_at => 
       (date.beginning_of_month..date.end_of_month)}) 

Pour obtenir la somme des coûts de tous les mois:

Expense.sum(:cost, 
    :group => "EXTRACT(YEAR_MONTH FROM created_at)").each do |y_m, cost_sum| 
    p "#{y_m}-#{cost_sum}" 
end 

Dans l'appel ci-dessus, utilisez l'option conditions pour restreindre le jeu de résultats à une plage de dates.

Questions connexes