2011-05-23 4 views
0

J'essaie de mettre en place une fonction de calendrier de base qui montrera le nombre d'articles postés pour un jour donné. J'ai donc besoin d'une requête qui donne la date et un compte pour ce jour de ma table. En ce moment je fais ceci:Meilleure façon de faire des requêtes personnalisées Rails

ActiveRecord::Base.connection.execute("SELECT COUNT(*), DATE(created_at) FROM 'articles' GROUP BY DATE(created_at)") 

qui retourne quelque chose comme:

[{"COUNT(*)"=>1, "DATE(created_at)"=>"2011-05-09", 0=>1, 1=>"2011-05-09" 
{"COUNT(*)"=>2, "DATE(created_at)"=>"2011-05-12", 0=>2, 1=>"2011-05-12"}, 
{"COUNT(*)"=>2, "DATE(created_at)"=>"2011-05-13", 0=>2, 1=>"2011-05-13"}, 
... etc. 

Cependant, cela semble être un moyen vraiment mauvais pour faire cette chose particulière. Je voudrais aussi pouvoir enchaîner avec d'autres champs d'application ce que je l'ai mis en place de sorte qu'au lieu que je pouvais faire quelque chose comme:

Article.no_spam.date_counts 

et obtenir un résultat similaire. Y a-t-il un moyen plus Rails-y de faire cela? J'utilise Rails 3.

EDIT: Personne n'a répondu, j'ai trouvé une solution laide, mais réalisable, au cas où quelqu'un en aurait besoin dans le futur. Cependant, s'il y a une meilleure façon de le faire, s'il vous plaît laissez-moi savoir: Voici mon code (en Article.rb):

def self.datecount 
    #this query is a mega hack, but it alows me to chain Article scopes nicely 
    counts = select("COUNT(created_at) as id, created_at").group("DATE(created_at)") 
    out = {} 
    counts.each do |a| 
     out[a.created_at.to_date] = a.id 
    end 
    out 
end 

cela ne me permet d'enchaîner mes champs d'application que je veux Article.no_spam.datecount retourne un hash de {dates => counts}, et je peux aussi ajouter d'autres étendues sur la pile. Il est tellement laid à l'intérieur ...

Répondre

0

Si vous

Article.group('DATE(created_at)').count 

Vous obtiendrez un hachage de created_at dates pour count s des articles créés à cette date.

+0

Eh oui, merci, je viens de comprendre que dehors, waaaaay simple de cette façon. – NateTheBookie

+0

C'est une sorte de syntaxe non intuitive dans mon esprit, puisque vous attendez count pour retourner un int, mais ça marche bien! – andrewmitchell

-1

meilleure façon pour self.datecount est

out = counts.group_by(&:created_at) 

ou

out = counts.map{|a| [a.created_at.to_date, a.id] }.group_by(&:first) 
Questions connexes