2011-02-02 13 views
66

Recientemente comencé una pasantía. Mi empleador usa Ruby on Rails, y frecuentemente encuentro nuevas sintaxis que necesito buscar para entender. He buscado en Google una buena explicación de named_scope, pero lo que he encontrado hasta ahora son en su mayoría publicaciones de blog que elogian mucho, más bien una definición o introducción directa.¿Qué es scope/named_scope en rieles?

¿Qué es exactamente named_scope (ahora simplemente llamado scope) en ruby ​​on rails?

+0

posible duplicado de [¿Cuál es la importancia del alcance con nombre en Rails?] (Http://stackoverflow.com/questions/2919730/whats-the-significance-of-named-scope-in-rails) – jdl

+2

This blog post fue invaluable para mí al aprender ámbitos con nombre: http://ryandaigle.com/articles/2008/8/20/named-scope-it-s-not-just-for-conditions-ya-know –

+0

Enlace para ryandaigle ahora encontrado aquí: http://archives.ryandaigle.com/articles/2008/8/20/named-scope-it-s-not-just-for-conditions-ya-know –

Respuesta

152

Un alcance es un subconjunto de una colección. ¿Suena complicado? No lo es Imagínese esto:

Tiene usuarios. Ahora, algunos de esos usuarios están suscritos a su boletín de noticias. Marcó a los que reciben un boletín agregando un campo a la base de datos de usuarios (user.subscribed_to_newsletter = true). Naturalmente, a veces desea obtener aquellos Usuarios que están suscritos a su boletín de noticias.

Se podría, por supuesto, siempre hacer esto:

User.where(subscribed_to_newsletter: true).each do #something 

vez siempre de escribir este se podría, sin embargo, hacer algo como esto.

#File: users.rb 
class User < ActiveRecord::Base 
    scope :newsletter, where(subscribed_to_newsletter: true) 
    #yada yada 
end 

Si está utilizando Carriles 4 o más nuevos, debe hacerse lo siguiente:

#File: users.rb 
class User < ActiveRecord::Base 
    scope :newsletter, -> { where(subscribed_to_newsletter: true) } 
    #yada yada 
end 

Esto le permite acceder a sus suscriptores simplemente hacer esto:

User.newsletter.each do #something 

Este es un ejemplo muy simple, pero en general los alcances pueden ser herramientas muy potentes para facilitar su trabajo.

Salida este enlace: API Description

+6

¿Puedo preguntar cuáles son las ventajas de esto sobre decir definir un método en la clase de usuario llamado 'subscribedUsers'? p.ej. 'def selfsscribedUsers self.where (: subscribed_to_newsletter => true) end – redroot

+3

@redroot la ventaja es que la sintaxis 'scope' es mucho más limpia, obtienes el mismo resultado pero con solo una línea –

+1

puedes encadenar ámbitos – nir0

6

La mejor manera de entender acerca de los detalles es ir a la documentación de la API.

Obtendrá los detalles completos y las formas en que podemos usar los ámbitos.

API Documentation of Scope

20

ámbito en el registro activo es como métodos de clase pero vuelven objeto Relation que significa que puede llamar a otro ámbito o método de consulta registro activo en ella.

Por ejemplo, si usted tiene un modelo del zombi (tabla zombis) con métodos de alcance mencionados a continuación,

class Zombie 
    scope :rotting, -> { where(rotting: true) } 
    scope :fresh, -> { where('age < ?', 25) } 
    scope :recent, -> { order(:created_at, :desc) } 
end 

y llama

Zombie.rotting.fresh.recent.limit(3) 

Se traduce en el siguiente en SQL,

select "zombies.*" from "zombies" where "zombies"."rotting" = 't' and (age<20) order by create_at desc limit 3 

El ejemplo anterior se basa en la sintaxis de rails 4

4

El alcance le permite especificar consultas de uso común (se puede considerar como acceso directo para consultas largas o utilizadas con más frecuencia) a las que se puede hacer referencia como llamadas a métodos en los objetos o modelos de asociación.Con estos ámbitos, puede usar todos los métodos anteriormente cubiertos, como dónde, unir e incluir. Todos los métodos de ámbito devolverán un objeto ActiveRecord :: Relation que permitirá que otros métodos (como otros ámbitos) sean invocados.

Para definir un ámbito de aplicación sencilla, se utiliza el método de alcance dentro de la clase, pasando por la consulta que nos gustaría que se ejecute cuando este alcance se llama:

class Article < ActiveRecord::Base 
    scope :published, -> { where(published: true) } 
end 

Ésta es exactamente la misma que la definición de una método de clase, y que se utiliza es una cuestión de preferencia personal:

class Article < ActiveRecord::Base 
    def self.published 
    where(published: true) 
    end 
end 

por favor siga el siguiente enlace para una descripción completa con el ejemplo. Espero que esto ayude.

http://guides.rubyonrails.org/active_record_querying.html

+0

No es * exactamente lo mismo que definir un método de clase *. Los métodos de clase devuelven 'nil' en algunos casos, y por lo tanto no se pueden encadenar para ciertas condiciones. –

0

explicación simple.

Imagine que tiene un modelo: Persona. Los modelos deben ser singulares.

Ahora se imaginan:

  • desea que todas las personas en el mundo que tienen el pelo rojo.
  • desea que todas las personas en el mundo que juegan críquet

Usted podría conseguir esas clases particulares de personas mediante el uso de un endoscopio! (Disculpe el juego de palabras)

Ahora que no era tan difícil ¿no?

Cuestiones relacionadas