Centraliser le code métier

Centraliser le code métier

Prenons l'exemple d'une application disposant de billets (type blog) avec des liens vers le billet précédente et le billet suivant.

Les ID peuvent ne pas être séquentiels (si on supprime un billet) et il faut donc une requête pour récupérer le billet précédent et une autre pour le billet suivant. Pour éviter ces 2 requêtes à chaque affichage, on stock ces informations (qui varient peu au cours du temps) dans des colonnes dédiés previous_post_id et next_post_id.

Pour éviter d'avoir à maintenir ces colonnes quand on crée un billet ou quand on en supprime un, on peut utiliser les callbacks.

class Post < ActiveRecord::Base
  belongs_to :previous_post, class_name: "Post"
  belongs_to :next_post, class_name: "Post"
 
  after_create  :update_next_post_of_last_post
  after_destroy :update_previous_and_next_posts
 
  # When we create a new post, the previous last one points to it.
  def update_next_post_of_last_post
    old_last_post = Post.where { id != self.id }.last
    old_last_post.update_attribute :next_post_id, self.id
  end
 
  # Wen we delete a post, its previous now points to its next
  # and its next points to its previous.
  def update_previous_and_next_posts
    previous_post.update_attribute :next_post_id, next_post.id
    next_post.update_attribute :previous_post_id, previous_post.id
  end
end

Ainsi, nos contrôleurs restent très simples puisqu'il n'y à rien de plus à faire :

class PostsController > ActionController::Base
  def create
    post = Post.create(params[:post])
    redirect_to post
  end
 
  def destroy
    post = Post.find(params[:id])
    redirect_to posts_path
  end
end
 
pourquoi_utiliser_un_framework/centraliser_le_code_metier.txt · Dernière modification: 2011/09/09 13:30 par Sephi-Chan