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.
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.
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.
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.
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.
33. ActiveRecord
• Resuelve problemas como la falta de
asociaciones y herencia (STI).
• Agregaciones, validaciones, callbacks,
observers, transacciones, reflexiones, etc.
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.
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.
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
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