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 ...
Eh oui, merci, je viens de comprendre que dehors, waaaaay simple de cette façon. – NateTheBookie
C'est une sorte de syntaxe non intuitive dans mon esprit, puisque vous attendez count pour retourner un int, mais ça marche bien! – andrewmitchell