SlideShare ist ein Scribd-Unternehmen logo
1 von 61
Integración de Arel
 en ActiveRecord


Emilio Tagua - miloops@gmail.com
¿Quién les habla?
¿Quién les habla?
• Co-fundador de Eventioz, el sitio de registro
  online más grande de Latinoamérica.
¿Quién les habla?
• Co-fundador de Eventioz, el sitio de registro
  online más grande de Latinoamérica.

• Utilizando Ruby y Rails desde hace más de 3
  años.
¿Quién les habla?
• Co-fundador de Eventioz, el sitio de registro
  online más grande de Latinoamérica.

• Utilizando Ruby y Rails desde hace más de 3
  años.

• Ganador de Rails Hackfest y escritor de la
  guía oficial "Debugging Rails Applications
  guide" para el Rails Guide Hackfest.
¿Quién les habla?
• Co-fundador de Eventioz, el sitio de registro
  online más grande de Latinoamérica.

• Utilizando Ruby y Rails desde hace más de 3
  años.

• Ganador de Rails Hackfest y escritor de la
  guía oficial "Debugging Rails Applications
  guide" para el Rails Guide Hackfest.

• Contribuidor a Rails desde el 2008 con más
  de 40 parches antes de participar en Google.
Google Summer of Code
Google Summer of Code
• Programa creado por Google en el año 2005.
Google Summer of Code
• Programa creado por Google en el año 2005.
• Cualquier estudiante puede enviar una
  propuesta de un proyecto para alguna
  organización Open Source que participe del
  programa.
Google Summer of Code
• Programa creado por Google en el año 2005.
• Cualquier estudiante puede enviar una
  propuesta de un proyecto para alguna
  organización Open Source que participe del
  programa.

• Si es aceptada, se asigna un mentor y
  comienza el programa.
Google Summer of Code
• Programa creado por Google en el año 2005.
• Cualquier estudiante puede enviar una
  propuesta de un proyecto para alguna
  organización Open Source que participe del
  programa.

• Si es aceptada, se asigna un mentor y
  comienza el programa.

• Mi propuesta para GSoC 2009: Integrar Arel
  en ActiveRecord.
Algebra Relacional
Algebra Relacional

• Describe la manipulación de los datos.
Algebra Relacional

• Describe la manipulación de los datos.
• Operaciones se usan como representación
  intermedia de una consulta a una base de
  datos.
Algebra Relacional

• Describe la manipulación de los datos.
• Operaciones se usan como representación
  intermedia de una consulta a una base de
  datos.

• Sirven para obtener una versión más
  optimizada y eficiente de la consulta.
Arel
Arel

• Algebra Relacional para Ruby.
Arel

• Algebra Relacional para Ruby.
• Creada por Nick Kallen (Twitter).
Arel

• Algebra Relacional para Ruby.
• Creada por Nick Kallen (Twitter).
• Simplifica la generación de consultas SQL
  complejas.
Arel

• Algebra Relacional para Ruby.
• Creada por Nick Kallen (Twitter).
• Simplifica la generación de consultas SQL
  complejas.

• Manipulación de objetos para la creación de
  las mismas.
Arel

• Algebra Relacional para Ruby.
• Creada por Nick Kallen (Twitter).
• Simplifica la generación de consultas SQL
  complejas.

• Manipulación de objetos para la creación de
  las mismas.

• Inmutabilidad de las relaciones.
Arel



users = Table(:users)
users.to_sql

# => SELECT * FROM users
Arel



users.where(users[:name].eq('amy'))

# => SELECT * FROM users WHERE users.name = 'amy'
Arel



users.join(photos).on(users[:id].eq(photos[:user_id]))

# => SELECT * FROM users INNER JOIN photos ON users.id =
photos.user_id
ActiveRecord
ActiveRecord

• Relaciona objetos de negocio con tablas de la
  base de datos para crear un modelo de
  dominio persistente.
ActiveRecord

• Relaciona objetos de negocio con tablas de la
  base de datos para crear un modelo de
  dominio persistente.

• Implementación del patrón mapeo objeto-
  relacional (ORM) en Ruby on Rails.
ActiveRecord

• Relaciona objetos de negocio con tablas de la
  base de datos para crear un modelo de
  dominio persistente.

• Implementación del patrón mapeo objeto-
  relacional (ORM) en Ruby on Rails.

• Un objeto representa una fila en una base de
  datos o vista, encapsulando el acceso y
  agregando lógica de dominio los datos.
ActiveRecord
ActiveRecord


• Resuelve problemas como la falta de
  asociaciones y herencia (STI).
ActiveRecord


• Resuelve problemas como la falta de
  asociaciones y herencia (STI).
ActiveRecord


• Resuelve problemas como la falta de
  asociaciones y herencia (STI).



• Agregaciones, validaciones, callbacks,
  observers, transacciones, reflexiones, etc.
Integrar Arel en
 ActiveRecord
Integrar Arel en
        ActiveRecord
• Proveer a ActiveRecord una implementación más
  limpia de generación de consultas.
Integrar Arel en
         ActiveRecord
• Proveer a ActiveRecord una implementación más
  limpia de generación de consultas.

• Eliminar la generación de SQL mediante la
  concatenación de cadenas delegándolo a un
  framework-framework como Arel.
Integrar Arel en
         ActiveRecord
• Proveer a ActiveRecord una implementación más
   limpia de generación de consultas.

• Eliminar la generación de SQL mediante la
   concatenación de cadenas delegándolo a un
   framework-framework como Arel.

• Tener código más limpio, mantenible y sólido en los
   componentes de ActiveRecord.
Integrar Arel en
         ActiveRecord
• Proveer a ActiveRecord una implementación más
   limpia de generación de consultas.

• Eliminar la generación de SQL mediante la
   concatenación de cadenas delegándolo a un
   framework-framework como Arel.

• Tener código más limpio, mantenible y sólido en los
   componentes de ActiveRecord.

• Proveer una API mejor.
Integrar Arel en
         ActiveRecord
• Proveer a ActiveRecord una implementación más
   limpia de generación de consultas.

• Eliminar la generación de SQL mediante la
   concatenación de cadenas delegándolo a un
   framework-framework como Arel.

• Tener código más limpio, mantenible y sólido en los
   componentes de ActiveRecord.

• Proveer una API mejor.
• Manipulación de relaciones.
Alcance
Alcance
• Finders
Alcance
• Finders
• Acciones ABM de clase e instancias
Alcance
• Finders
• Acciones ABM de clase e instancias
• Migraciones
Alcance
• Finders
• Acciones ABM de clase e instancias
• Migraciones
• Locking
Alcance
• Finders
• Acciones ABM de clase e instancias
• Migraciones
• Locking
• Cálculos
Alcance
• Finders
• Acciones ABM de clase e instancias
• Migraciones
• Locking
• Cálculos
• Asociaciones
Alcance
• Finders
• Acciones ABM de clase e instancias
• Migraciones
• Locking
• Cálculos
• Asociaciones
ActiveRecord::Relation
ActiveRecord::Relation


• Rails 2.3 ActiveRecord::Base#all es una alias
  de ActiveRecord::Base#find(:all).
ActiveRecord::Relation


• Rails 2.3 ActiveRecord::Base#all es una alias
  de ActiveRecord::Base#find(:all).
ActiveRecord::Relation


• Rails 2.3 ActiveRecord::Base#all es una alias
  de ActiveRecord::Base#find(:all).



• Rails 3 ActiveRecord::Base#all devuelve un
  objeto de tipo ActiveRecord::Relation.
ActiveRecord::Relation
ActiveRecord::Relation

• ActiveRecord::Relation#(first|select|group|
  order|limit|offset|joins|conditions).
ActiveRecord::Relation

• ActiveRecord::Relation#(first|select|group|
  order|limit|offset|joins|conditions).

• Posee dentro una estructura para construir
  una consulta pero no la ejecuta hasta que
  ActiveRecord::Relation#to_a es llamado.
ActiveRecord::Relation

• ActiveRecord::Relation#(first|select|group|
  order|limit|offset|joins|conditions).

• Posee dentro una estructura para construir
  una consulta pero no la ejecuta hasta que
  ActiveRecord::Relation#to_a es llamado.

• Permite la construcción de una consulta
  mediante la manipulación de objetos.
Un mejor código
# Rails 2.3
def destroy
  unless new_record?
    connection.delete(
      "DELETE FROM #{self.class.quoted_table_name} " +
      "WHERE #{connection.quote_column_name(self.class.primary_key)} =
#{quoted_id}",
      "#{self.class.name} Destroy"
    )
  end

  @destroyed = true
  freeze
end

# Rails 3
def destroy
  unless new_record?
    self.class.arel_table.conditions(self.class.arel_table[self.class.primary_key]
.eq(id)).delete
  end

  @destroyed = true
  freeze
end
Un mejor código
# Rails 2.3
def update(attribute_names = @attributes.keys)
  quoted_attributes = attributes_with_quotes(false, false, attribute_names)
  return 0 if quoted_attributes.empty?
  connection.update(
    "UPDATE #{self.class.quoted_table_name} " +
    "SET #{quoted_comma_pair_list(connection, quoted_attributes)} " +
    "WHERE #{connection.quote_column_name(self.class.primary_key)} =
#{quote_value(id)}",
    "#{self.class.name} Update"
  )
end

# Rails 3
def update(attribute_names = @attributes.keys)
  attributes_with_values = arel_attributes_values(false, false, attribute_names)
  return 0 if attributes_with_values.empty?
  self.class.arel_table.conditions(
    self.class.arel_table[self.class.primary_key].eq(id)
  ).update(attributes_with_values)
end
API

@posts = Post.all(:conditions => {:title => "A new topic"})
@posts = @posts.limit(n) if n && n > 0

for post in @posts
  p post.title
end
Inmutabilidad
 Cada operación sobre una relación devuelve una
                nueva operación

def select(selects)
  selects.blank? ? self : Relation.new(@klass,
@relation.project(selects))
end



def group(groups)
  groups.blank? ? self : Relation.new(@klass,
@relation.group(groups))
end
No es "magia"
                      Arel::Relation#select_sql


# ...

 build_query 
          "SELECT     #{select_clauses.join(', ')}",
          "FROM       #{table_sql(Sql::TableReference.new(self))}",
          (joins(self)                                   unless joins(self).blank? ),
          ("WHERE     #{where_clauses.join("ntAND ")}" unless wheres.blank?      ),
          ("GROUP BY  #{group_clauses.join(', ')}"       unless groupings.blank?   ),
          ("ORDER BY  #{order_clauses.join(', ')}"       unless orders.blank?      ),
          ("LIMIT     #{taken}"                          unless taken.blank?       ),
          ("OFFSET    #{skipped}"                        unless skipped.blank?     )

# ...
¡¡¡ Gracias !!!



¿¿¿ Preguntas ???



Emilio Tagua - miloops@gmail.com

Weitere ähnliche Inhalte

Ähnlich wie Integración de Arel en ActiveRecord

Hacm40 eq2-rational rose
Hacm40 eq2-rational roseHacm40 eq2-rational rose
Hacm40 eq2-rational rose
klef258
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
triana25
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
triana25
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
triana25
 
Taller Redis
Taller RedisTaller Redis
Taller Redis
betabeers
 

Ähnlich wie Integración de Arel en ActiveRecord (20)

Escalando a sus primeros 10 millones de usuarios
Escalando a sus primeros 10 millones de usuarios Escalando a sus primeros 10 millones de usuarios
Escalando a sus primeros 10 millones de usuarios
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Introducción a RubyOnRails
Introducción a RubyOnRailsIntroducción a RubyOnRails
Introducción a RubyOnRails
 
Hacm40 eq2-rational rose
Hacm40 eq2-rational roseHacm40 eq2-rational rose
Hacm40 eq2-rational rose
 
Ado.net
Ado.netAdo.net
Ado.net
 
Desarrollo de aplicaciones con wpf
Desarrollo de aplicaciones con wpfDesarrollo de aplicaciones con wpf
Desarrollo de aplicaciones con wpf
 
Escalando para sus primeros 10 millones de usuarios
Escalando para sus primeros 10 millones de usuariosEscalando para sus primeros 10 millones de usuarios
Escalando para sus primeros 10 millones de usuarios
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
 
ORACLE
ORACLEORACLE
ORACLE
 
Presentacion Ruby on Rails CTIC-Cusco2007
Presentacion Ruby on Rails CTIC-Cusco2007Presentacion Ruby on Rails CTIC-Cusco2007
Presentacion Ruby on Rails CTIC-Cusco2007
 
Scala desde c# y JavaScript
Scala desde c# y JavaScriptScala desde c# y JavaScript
Scala desde c# y JavaScript
 
Tesis Licenciatura
Tesis LicenciaturaTesis Licenciatura
Tesis Licenciatura
 
Lecciones aprendidas creando una red social
Lecciones aprendidas creando una red socialLecciones aprendidas creando una red social
Lecciones aprendidas creando una red social
 
Taller Redis
Taller RedisTaller Redis
Taller Redis
 
Tutorial en Apache Spark - Clasificando tweets en realtime
Tutorial en Apache Spark - Clasificando tweets en realtimeTutorial en Apache Spark - Clasificando tweets en realtime
Tutorial en Apache Spark - Clasificando tweets en realtime
 
Germán Peraferrer: Cormo Framework
Germán Peraferrer: Cormo FrameworkGermán Peraferrer: Cormo Framework
Germán Peraferrer: Cormo Framework
 
Cormo Framework
Cormo FrameworkCormo Framework
Cormo Framework
 
Hola RoR
Hola RoRHola RoR
Hola RoR
 

Integración de Arel en ActiveRecord

  • 1. Integración de Arel en ActiveRecord Emilio Tagua - miloops@gmail.com
  • 3. ¿Quién les habla? • Co-fundador de Eventioz, el sitio de registro online más grande de Latinoamérica.
  • 4. ¿Quién les habla? • Co-fundador de Eventioz, el sitio de registro online más grande de Latinoamérica. • Utilizando Ruby y Rails desde hace más de 3 años.
  • 5. ¿Quién les habla? • Co-fundador de Eventioz, el sitio de registro online más grande de Latinoamérica. • Utilizando Ruby y Rails desde hace más de 3 años. • Ganador de Rails Hackfest y escritor de la guía oficial "Debugging Rails Applications guide" para el Rails Guide Hackfest.
  • 6. ¿Quién les habla? • Co-fundador de Eventioz, el sitio de registro online más grande de Latinoamérica. • Utilizando Ruby y Rails desde hace más de 3 años. • Ganador de Rails Hackfest y escritor de la guía oficial "Debugging Rails Applications guide" para el Rails Guide Hackfest. • Contribuidor a Rails desde el 2008 con más de 40 parches antes de participar en Google.
  • 7.
  • 9. Google Summer of Code • Programa creado por Google en el año 2005.
  • 10. Google Summer of Code • Programa creado por Google en el año 2005. • Cualquier estudiante puede enviar una propuesta de un proyecto para alguna organización Open Source que participe del programa.
  • 11. Google Summer of Code • Programa creado por Google en el año 2005. • Cualquier estudiante puede enviar una propuesta de un proyecto para alguna organización Open Source que participe del programa. • Si es aceptada, se asigna un mentor y comienza el programa.
  • 12. Google Summer of Code • Programa creado por Google en el año 2005. • Cualquier estudiante puede enviar una propuesta de un proyecto para alguna organización Open Source que participe del programa. • Si es aceptada, se asigna un mentor y comienza el programa. • Mi propuesta para GSoC 2009: Integrar Arel en ActiveRecord.
  • 14. Algebra Relacional • Describe la manipulación de los datos.
  • 15. Algebra Relacional • Describe la manipulación de los datos. • Operaciones se usan como representación intermedia de una consulta a una base de datos.
  • 16. Algebra Relacional • Describe la manipulación de los datos. • Operaciones se usan como representación intermedia de una consulta a una base de datos. • Sirven para obtener una versión más optimizada y eficiente de la consulta.
  • 17. Arel
  • 19. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter).
  • 20. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter). • Simplifica la generación de consultas SQL complejas.
  • 21. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter). • Simplifica la generación de consultas SQL complejas. • Manipulación de objetos para la creación de las mismas.
  • 22. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter). • Simplifica la generación de consultas SQL complejas. • Manipulación de objetos para la creación de las mismas. • Inmutabilidad de las relaciones.
  • 24. Arel users.where(users[:name].eq('amy')) # => SELECT * FROM users WHERE users.name = 'amy'
  • 25. Arel users.join(photos).on(users[:id].eq(photos[:user_id])) # => SELECT * FROM users INNER JOIN photos ON users.id = photos.user_id
  • 27. ActiveRecord • Relaciona objetos de negocio con tablas de la base de datos para crear un modelo de dominio persistente.
  • 28. ActiveRecord • Relaciona objetos de negocio con tablas de la base de datos para crear un modelo de dominio persistente. • Implementación del patrón mapeo objeto- relacional (ORM) en Ruby on Rails.
  • 29. ActiveRecord • Relaciona objetos de negocio con tablas de la base de datos para crear un modelo de dominio persistente. • Implementación del patrón mapeo objeto- relacional (ORM) en Ruby on Rails. • Un objeto representa una fila en una base de datos o vista, encapsulando el acceso y agregando lógica de dominio los datos.
  • 31. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI).
  • 32. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI).
  • 33. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI). • Agregaciones, validaciones, callbacks, observers, transacciones, reflexiones, etc.
  • 34. Integrar Arel en ActiveRecord
  • 35. Integrar Arel en ActiveRecord • Proveer a ActiveRecord una implementación más limpia de generación de consultas.
  • 36. Integrar Arel en ActiveRecord • Proveer a ActiveRecord una implementación más limpia de generación de consultas. • Eliminar la generación de SQL mediante la concatenación de cadenas delegándolo a un framework-framework como Arel.
  • 37. Integrar Arel en ActiveRecord • Proveer a ActiveRecord una implementación más limpia de generación de consultas. • Eliminar la generación de SQL mediante la concatenación de cadenas delegándolo a un framework-framework como Arel. • Tener código más limpio, mantenible y sólido en los componentes de ActiveRecord.
  • 38. Integrar Arel en ActiveRecord • Proveer a ActiveRecord una implementación más limpia de generación de consultas. • Eliminar la generación de SQL mediante la concatenación de cadenas delegándolo a un framework-framework como Arel. • Tener código más limpio, mantenible y sólido en los componentes de ActiveRecord. • Proveer una API mejor.
  • 39. Integrar Arel en ActiveRecord • Proveer a ActiveRecord una implementación más limpia de generación de consultas. • Eliminar la generación de SQL mediante la concatenación de cadenas delegándolo a un framework-framework como Arel. • Tener código más limpio, mantenible y sólido en los componentes de ActiveRecord. • Proveer una API mejor. • Manipulación de relaciones.
  • 42. Alcance • Finders • Acciones ABM de clase e instancias
  • 43. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones
  • 44. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking
  • 45. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos
  • 46. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos • Asociaciones
  • 47. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos • Asociaciones
  • 49. ActiveRecord::Relation • Rails 2.3 ActiveRecord::Base#all es una alias de ActiveRecord::Base#find(:all).
  • 50. ActiveRecord::Relation • Rails 2.3 ActiveRecord::Base#all es una alias de ActiveRecord::Base#find(:all).
  • 51. ActiveRecord::Relation • Rails 2.3 ActiveRecord::Base#all es una alias de ActiveRecord::Base#find(:all). • Rails 3 ActiveRecord::Base#all devuelve un objeto de tipo ActiveRecord::Relation.
  • 54. ActiveRecord::Relation • ActiveRecord::Relation#(first|select|group| order|limit|offset|joins|conditions). • Posee dentro una estructura para construir una consulta pero no la ejecuta hasta que ActiveRecord::Relation#to_a es llamado.
  • 55. ActiveRecord::Relation • ActiveRecord::Relation#(first|select|group| order|limit|offset|joins|conditions). • Posee dentro una estructura para construir una consulta pero no la ejecuta hasta que ActiveRecord::Relation#to_a es llamado. • Permite la construcción de una consulta mediante la manipulación de objetos.
  • 56. Un mejor código # Rails 2.3 def destroy   unless new_record?     connection.delete(       "DELETE FROM #{self.class.quoted_table_name} " +       "WHERE #{connection.quote_column_name(self.class.primary_key)} = #{quoted_id}",       "#{self.class.name} Destroy"     )   end   @destroyed = true   freeze end # Rails 3 def destroy   unless new_record?     self.class.arel_table.conditions(self.class.arel_table[self.class.primary_key] .eq(id)).delete   end   @destroyed = true   freeze end
  • 57. Un mejor código # Rails 2.3 def update(attribute_names = @attributes.keys)   quoted_attributes = attributes_with_quotes(false, false, attribute_names)   return 0 if quoted_attributes.empty?   connection.update(     "UPDATE #{self.class.quoted_table_name} " +     "SET #{quoted_comma_pair_list(connection, quoted_attributes)} " +     "WHERE #{connection.quote_column_name(self.class.primary_key)} = #{quote_value(id)}",     "#{self.class.name} Update"   ) end # Rails 3 def update(attribute_names = @attributes.keys)   attributes_with_values = arel_attributes_values(false, false, attribute_names)   return 0 if attributes_with_values.empty?   self.class.arel_table.conditions( self.class.arel_table[self.class.primary_key].eq(id) ).update(attributes_with_values) end
  • 58. API @posts = Post.all(:conditions => {:title => "A new topic"}) @posts = @posts.limit(n) if n && n > 0 for post in @posts   p post.title end
  • 59. Inmutabilidad Cada operación sobre una relación devuelve una nueva operación def select(selects) selects.blank? ? self : Relation.new(@klass, @relation.project(selects)) end def group(groups) groups.blank? ? self : Relation.new(@klass, @relation.group(groups)) end
  • 60. No es "magia" Arel::Relation#select_sql # ...  build_query           "SELECT     #{select_clauses.join(', ')}",           "FROM       #{table_sql(Sql::TableReference.new(self))}",           (joins(self)                                   unless joins(self).blank? ),           ("WHERE     #{where_clauses.join("ntAND ")}" unless wheres.blank?      ),           ("GROUP BY  #{group_clauses.join(', ')}"       unless groupings.blank?   ),           ("ORDER BY  #{order_clauses.join(', ')}"       unless orders.blank?      ),           ("LIMIT     #{taken}"                          unless taken.blank?       ),           ("OFFSET    #{skipped}"                        unless skipped.blank?     ) # ...
  • 61. ¡¡¡ Gracias !!! ¿¿¿ Preguntas ??? Emilio Tagua - miloops@gmail.com