Rails, ou pourquoi faire compliqué quand on peut faire simple ?

Je découvre avec émerveillement l’attribut :include d’ActiveRecord::Base, qui efface de mon esprit des années de cauchemars SQL.

Jugez plutôt, quand une horreur pareille

self.find_by_sql([%{
  SELECT categories.id, categories.name, categories.permalink, categories.position, 
    COUNT(articles.id) AS article_counter
  FROM #{Category.table_name} categories
  LEFT OUTER JOIN #{Category.table_name_prefix}categorizations#{Category.table_name_suffix} articles_categories
    ON articles_categories.category_id = categories.id
  LEFT OUTER JOIN #{Article.table_name} articles
    ON (articles_categories.article_id = articles.id AND articles.published = ?)
  GROUP BY categories.id, categories.name, categories.position, categories.permalink
  ORDER BY position
}, true]).each {|item| item.article_counter = item.article_counter.to_i }

devient tout simplement :

self.find(
  :all, 
  :include => :articles, 
  :conditions => ['contents.published = ?', true], 
  :order => 'position').each { |cat| cat.update_attributes(:article_counter => cat.articles.length) }

C’est beau, pour un peu j’en pleurerais.

Le long de la Seine

Publié le 29 mars 2007 à 09h52 Publié sous et Labels ruby, sql, requête, include, jointure, rubyonrails, rails

À propos

Frédéric de Villamil

Je m'appelle Frédéric de Villamil, et quand je ne déploie pas ma mauvaise humeur et ma mauvaise foi sur le Web, je suis un super héros chargé de sauver le monde. Vous pouvez me suivre sur Twitter.

  1. Olivier G. le 31 mars 2007 à 13h11

    On dirait du Jquery.

Réagir à Rails, ou pourquoi faire compliqué quand on peut faire simple ?

Afin de maintenir le niveau global de ce site, les commentaires font l'objet d'une politique de modération qualitative basée sur des critères non écrits et totalement subjectifs, donc injustes.

Les commentaires écrits en langage SMS, inutiles, déplacés, injurieux ou relevant du spam seront systématiquement supprimés sans avertissement préalable.

Les trackbacks sont fermés pour cause de spam.