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...
¿Quién les habla?
• Co-fundador de Eventioz, el sitio de registro
  online más grande de Latinoamérica.

• Utilizando Ruby...
¿Quién les habla?
• Co-fundador de Eventioz, el sitio de registro
  online más grande de Latinoamérica.

• Utilizando Ruby...
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 ...
Google Summer of Code
• Programa creado por Google en el año 2005.
• Cualquier estudiante puede enviar una
  propuesta de ...
Google Summer of Code
• Programa creado por Google en el año 2005.
• Cualquier estudiante puede enviar una
  propuesta de ...
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...
Algebra Relacional

• Describe la manipulación de los datos.
• Operaciones se usan como representación
  intermedia de una...
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
  com...
Arel

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

• Algebra Relacional para Ruby.
• Creada por Nick Kallen (Twitter).
• Simplifica la generación de consultas SQL
  com...
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 =
p...
ActiveRecord
ActiveRecord

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

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

• Relaciona objetos de negocio con tablas de la
  base de datos para crear un modelo de
  dominio persistent...
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, cal...
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...
Integrar Arel en
         ActiveRecord
• Proveer a ActiveRecord una implementación más
   limpia de generación de consulta...
Integrar Arel en
         ActiveRecord
• Proveer a ActiveRecord una implementación más
   limpia de generación de consulta...
Integrar Arel en
         ActiveRecord
• Proveer a ActiveRecord una implementación más
   limpia de generación de consulta...
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 A...
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 dent...
ActiveRecord::Relation

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

• Posee dent...
Un mejor código
# Rails 2.3
def destroy
  unless new_record?
    connection.delete(
      "DELETE FROM #{self.class.quoted...
Un mejor código
# Rails 2.3
def update(attribute_names = @attributes.keys)
  quoted_attributes = attributes_with_quotes(fa...
API

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

for post in @post...
Inmutabilidad
 Cada operación sobre una relación devuelve una
                nueva operación

def select(selects)
  selec...
No es "magia"
                      Arel::Relation#select_sql


# ...

 build_query 
          "SELECT     #{select_clause...
¡¡¡ Gracias !!!



¿¿¿ Preguntas ???



Emilio Tagua - miloops@gmail.com
Integración de Arel en ActiveRecord
Upcoming SlideShare
Loading in …5
×

Integración de Arel en ActiveRecord

1,152 views

Published on

  • Be the first to comment

  • Be the first to like this

Integración de Arel en ActiveRecord

  1. 1. Integración de Arel en ActiveRecord Emilio Tagua - miloops@gmail.com
  2. 2. ¿Quién les habla?
  3. 3. ¿Quién les habla? • Co-fundador de Eventioz, el sitio de registro online más grande de Latinoamérica.
  4. 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. 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. 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. 7. Google Summer of Code
  8. 8. Google Summer of Code • Programa creado por Google en el año 2005.
  9. 9. 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.
  10. 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. • Si es aceptada, se asigna un mentor y comienza el programa.
  11. 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. • Mi propuesta para GSoC 2009: Integrar Arel en ActiveRecord.
  12. 12. Algebra Relacional
  13. 13. Algebra Relacional • Describe la manipulación de los datos.
  14. 14. Algebra Relacional • Describe la manipulación de los datos. • Operaciones se usan como representación intermedia de una consulta a una base de datos.
  15. 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. • Sirven para obtener una versión más optimizada y eficiente de la consulta.
  16. 16. Arel
  17. 17. Arel • Algebra Relacional para Ruby.
  18. 18. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter).
  19. 19. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter). • Simplifica la generación de consultas SQL complejas.
  20. 20. 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.
  21. 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. • Inmutabilidad de las relaciones.
  22. 22. Arel users = Table(:users) users.to_sql # => SELECT * FROM users
  23. 23. Arel users.where(users[:name].eq('amy')) # => SELECT * FROM users WHERE users.name = 'amy'
  24. 24. Arel users.join(photos).on(users[:id].eq(photos[:user_id])) # => SELECT * FROM users INNER JOIN photos ON users.id = photos.user_id
  25. 25. ActiveRecord
  26. 26. ActiveRecord • Relaciona objetos de negocio con tablas de la base de datos para crear un modelo de dominio persistente.
  27. 27. 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.
  28. 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. • Un objeto representa una fila en una base de datos o vista, encapsulando el acceso y agregando lógica de dominio los datos.
  29. 29. ActiveRecord
  30. 30. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI).
  31. 31. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI).
  32. 32. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI). • Agregaciones, validaciones, callbacks, observers, transacciones, reflexiones, etc.
  33. 33. Integrar Arel en ActiveRecord
  34. 34. Integrar Arel en ActiveRecord • Proveer a ActiveRecord una implementación más limpia de generación de consultas.
  35. 35. 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.
  36. 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. • Tener código más limpio, mantenible y sólido en los componentes de ActiveRecord.
  37. 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. • Proveer una API mejor.
  38. 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. • Manipulación de relaciones.
  39. 39. Alcance
  40. 40. Alcance • Finders
  41. 41. Alcance • Finders • Acciones ABM de clase e instancias
  42. 42. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones
  43. 43. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking
  44. 44. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos
  45. 45. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos • Asociaciones
  46. 46. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos • Asociaciones
  47. 47. ActiveRecord::Relation
  48. 48. ActiveRecord::Relation • Rails 2.3 ActiveRecord::Base#all es una alias de ActiveRecord::Base#find(:all).
  49. 49. ActiveRecord::Relation • Rails 2.3 ActiveRecord::Base#all es una alias de ActiveRecord::Base#find(:all).
  50. 50. 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.
  51. 51. ActiveRecord::Relation
  52. 52. ActiveRecord::Relation • ActiveRecord::Relation#(first|select|group| order|limit|offset|joins|conditions).
  53. 53. 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.
  54. 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. • Permite la construcción de una consulta mediante la manipulación de objetos.
  55. 55. 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
  56. 56. 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
  57. 57. 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
  58. 58. 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
  59. 59. 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?     ) # ...
  60. 60. ¡¡¡ Gracias !!! ¿¿¿ Preguntas ??? Emilio Tagua - miloops@gmail.com

×