|
Centraliser le code métier
|
Centraliser le code métierPrenons 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
|