rails query left joins includes active ruby-on-rails named-scope

ruby-on-rails - left - rails sql query



¿Qué es scope/named_scope en rieles? (5)

El alcance en el registro activo es como los métodos de clase pero devuelven el objeto Relación, lo que significa que puede llamar a otro alcance o método activo de consulta de registros.

Por ejemplo, si tiene un modelo Zombie (tabla de zombies) con los 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 tu llamas

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

Se traduce a lo 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 carriles 4

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 exactamente named_scope (ahora simplemente llamado scope) en ruby ​​on rails?


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 alcance devolverán un objeto ActiveRecord :: Relation que permitirá que otros métodos (como otros ámbitos) sean llamados.

Para definir un alcance simple, usamos el método de alcance dentro de la clase, pasando la consulta que nos gustaría ejecutar cuando se llama a este alcance:

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

Esto es exactamente lo mismo que definir un método de clase, y lo que usa 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


Explicación simple

Imagina que tienes un modelo: Persona . Los modelos deben ser singulares.

Ahora imagínate:

  • quiero a todas las personas en el mundo que tienen el pelo rojo.
  • quiero a todas las personas en el mundo que juegan al cricket

¡Puede obtener esas clases particulares de personas usando un alcance! (Disculpe el juego de palabras)

Ahora que no era tan difícil ¿verdad?



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

Tienes 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.

Por supuesto, siempre puedes hacer esto:

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

En lugar de escribir siempre esto, podrías hacer algo como esto.

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

Si está utilizando Rails 4 o posterior , haga esto en su lugar:

#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 haciendo 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.

Echa un vistazo a este enlace: API Descripción