Your SlideShare is downloading. ×
  • Like
Integración de Arel en ActiveRecord
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Integración de Arel en ActiveRecord

  • 1,005 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,005
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
4
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Integración de Arel en ActiveRecord Emilio Tagua - miloops@gmail.com
  • 2. ¿Quién les habla?
  • 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. Google Summer of Code
  • 8. Google Summer of Code • Programa creado por Google en el año 2005.
  • 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. 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. 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. Algebra Relacional
  • 13. Algebra Relacional • Describe la manipulación de los datos.
  • 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. 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. Arel
  • 17. Arel • Algebra Relacional para Ruby.
  • 18. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter).
  • 19. Arel • Algebra Relacional para Ruby. • Creada por Nick Kallen (Twitter). • Simplifica la generación de consultas SQL complejas.
  • 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. 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. Arel users = Table(:users) users.to_sql # => SELECT * FROM users
  • 23. Arel users.where(users[:name].eq('amy')) # => SELECT * FROM users WHERE users.name = 'amy'
  • 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. ActiveRecord
  • 26. ActiveRecord • Relaciona objetos de negocio con tablas de la base de datos para crear un modelo de dominio persistente.
  • 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. 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. ActiveRecord
  • 30. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI).
  • 31. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI).
  • 32. ActiveRecord • Resuelve problemas como la falta de asociaciones y herencia (STI). • Agregaciones, validaciones, callbacks, observers, transacciones, reflexiones, etc.
  • 33. Integrar Arel en ActiveRecord
  • 34. Integrar Arel en ActiveRecord • Proveer a ActiveRecord una implementación más limpia de generación de consultas.
  • 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. 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. 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. 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. Alcance
  • 40. Alcance • Finders
  • 41. Alcance • Finders • Acciones ABM de clase e instancias
  • 42. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones
  • 43. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking
  • 44. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos
  • 45. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos • Asociaciones
  • 46. Alcance • Finders • Acciones ABM de clase e instancias • Migraciones • Locking • Cálculos • Asociaciones
  • 47. ActiveRecord::Relation
  • 48. ActiveRecord::Relation • Rails 2.3 ActiveRecord::Base#all es una alias de ActiveRecord::Base#find(:all).
  • 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). • Rails 3 ActiveRecord::Base#all devuelve un objeto de tipo ActiveRecord::Relation.
  • 51. ActiveRecord::Relation
  • 52. ActiveRecord::Relation • ActiveRecord::Relation#(first|select|group| order|limit|offset|joins|conditions).
  • 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. 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. 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. 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. 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. 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. 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. ¡¡¡ Gracias !!! ¿¿¿ Preguntas ??? Emilio Tagua - miloops@gmail.com