2011-06-16 9 views
6

¿Los ámbitos solo tienen sintaxis de azúcar, o hay alguna ventaja real en su uso frente a los métodos de clase?Ámbitos vs métodos de clase en Rails 3

Un ejemplo simple sería el siguiente. Son intercambiables, por lo que yo sé.

scope :without_parent, where(:parent_id => nil) 

# OR 

def self.without_parent 
    self.where(:parent_id => nil) 
end 

¿Para qué es cada técnica más adecuada?

EDITAR

named_scope.rb menciona lo siguiente (como se señala más adelante por goncalossilva):

Línea 54:

Tenga en cuenta que esto es simplemente 'sintáctica azúcar' para definir una clase real método

Línea 113:

ámbitos nombrados también pueden tener extensiones, al igual que con las declaraciones has_many:

class Shirt < ActiveRecord::Base 
    scope :red, where(:color => 'red') do 
    def dom_id 
     'red_shirts' 
    end 
    end 
end 
+1

El problema con los ámbitos es que a veces pueden llenar la parte superior del modelo. Estoy bastante seguro de que son solo azúcar sintáctica. Con los rieles 3 cargando flojamente, no hay ninguna razón por la que no puedas usar un método de clase como dijiste. En este punto, realmente se trata de una cuestión de preferencia. – agmcleod

+0

Platsformatec tiene una muy buena comparación en http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/ – caspyin

Respuesta

11

Para los casos de uso sencillos, uno puede ver como acaba siendo el azúcar sintaxis. Sin embargo, hay algunas diferencias que van más allá de eso.

Uno, por ejemplo, es el capacidad de definir las extensiones en los ámbitos:

class Flower < ActiveRecord::Base 
    named_scope :red, :conditions => {:color => "red"} do 
    def turn_blue 
     each { |f| f.update_attribute(:color, "blue") } 
    end 
    end 
end 

En este caso, turn_blue sólo está disponible para las flores de color rojo (porque no está definido en la clase de flores pero en el ámbito propio)

+1

Uuh, eso es ingenioso :) * inicia la consola * –

Cuestiones relacionadas