Développeur Web RoR

Aller au contenu | Aller au menu | Aller à la recherche

Tag - named_scope

Fil des billets

dimanche 27 novembre 2011

Rails 3 default_scope et unscoped

Rails 3 a apporté un petit truc sympa le default_scope. Il permet d'appeler un scope par défaut sur un model. Par contre il peut être sympa dans certain cas d'éviter d'utiliser le default_scope. C'est pour cette raison qu'il existe unscoped

Exemple :

class Product < ActiveRecord::Base

  default_scope :order_by_name, order(:name)

end

# Ordonné par name

# SELECT * FROM products ORDER BY name;

Product.all 

# SELECT * FROM products;

Product.unscoped.all

A retenir ! En même temps c'est pas très compliqué !

jeudi 5 novembre 2009

Named_scope pour les performances

Quand on développe des applications web avec RubyOnRails le problème des performances se pose tôt où tard (d'ailleur souvent trop tard).

Par exemple on veut connaitre la liste des produits d'un famille :

Controller :
@family = Family.find(params:id)

Dans la vue :
<% @family.products.each do |p| %>
<%= p.picture.path %>
<% end %>

Et là vous regardez les requêtes au serveur : (2 * @family.products.count) requêtes !

C'est pour ça qu'existe l'option :include dans la méthode find, elle met en cache les objets en relation qui sont spécifiés.

Exemple dans le controller @family = Family.find(params:id, :include => {:products => :picture} )

Et là 1 requête.

Et l'avantage, parce que j'ai eu ce problème, c'est qu'on peut utiliser les named_scope :

named_scope :include_products, :include => {:products => :picture}

Du coup dans le controller :
@family = Family.include_products.find(params:id)

Du coup là c'est nettement plus performant !