2010-05-27 5 views
2

Avant d'aller pour plus de détails.Quelle est la signification de la portée nommée dans Rails?

Question 1: - Quel est le sens de la portée ici (ie nom ** champ) **

ce sont les avantages de l'utilisation du nom de champ?

maintenant: -

de développement Agile avec Rails livre: -

class Order < ActiveRecord::Base 
    named_scope :last_n_days, lambda { |days| {:conditions => 
    ['updated < ?' , days] } } 

named_scope :checks, :conditions => {:pay_type => :check} 
end 

Un tel champ nommé ferait trouver la dernière semaine de la valeur des commandes de un tournemain .

orders = Orders.last_n_days(7) 

Scopes peuvent également être combinées

orders = Orders.checks.last_n_days(7) 

pourquoi nous utilisons named_scope ici. Nous pouvons faire la même chose en utilisant des méthodes. Quelle est la chose spéciale que nous avons eu en utilisant named_scope.

+0

Note pour Rubyist comme moi ;-): 'named_scope' est utilisé dans Rails <3, qui est remplacé par' scope' dans Rails> = 3. –

Répondre

2

Scope signifie simplement une plage sélectionnée. Donc, si vous utilisez:

orders = Orders.checks.last_n_days(7) 

vous voulez sélectionner des commandes seulement que les commandes qui sont payés par chèque et sont dans les 7 derniers jours. Donc, vous 'scope' des commandes.

Pourquoi ne pas utiliser des méthodes?

Les portées nommées sont des méthodes. C'est juste une manière plus simple de les définir afin que vous n'ayez pas à vous soucier de tous les détails et vous pouvez être heureux de l'utiliser!

Et rappelez-vous que les étendues ne font qu'ajouter des conditions (et d'autres choses) à la requête sql.

2

Les named_scope sont vraiment utiles pour 2 cas

mieux readabililty

Avec une bonne named_scope vous pouvez comprendre plus facilement ce que vous voulez vraiment chercher.

Chaînage

Tous named_scope peuvent être enchaînées. Donc, si vous voulez faire un système de recherche, c'est facile à faire. Faites-le avant qu'il ne soit douloureux.

Vous pouvez générer la chaîne à la volée.

3

nous raccourcissent, chainable et code plus lisible:

orders = Orders.checks.last_n_days(7) 

est beaucoup plus lisible, plus court et non chainables que

orders = Orders.all :conditions => ["updated < ? and pay_type='check'", 7] 

En Rails3 l'avantage sera encore plus grande, en raison de arel. Pour plus d'informations, je vous recommande de regarder les Railscasts:

  1. 108 named_scope (quelques notions de base dans les rails 2)
  2. 202 Active Record Queries in Rails 3 (quelques bases dans les rails 3)
  3. 215 Advanced Queries in Rails 3 (certains sujets avancés dans les rails 3)
+0

Fahnenbruck Quel est le sens de la portée ici. Quel genre de portée dont nous parlons. –

+0

Que voulez-vous dire? IMHO a répondu ceci: 'nous obtenons le code plus court, chainable, et plus lisible' Mon exemple de code est le même que le vôtre – jigfox

Questions connexes