¿Cómo puedo reducir el número de Queries utilizando RubyOnRails con Active Records? joins, include – Eager loading Associations

Naturaleza caprichosaLo que voy a explicar en este post, es fruto de algunas preguntas que suelen ocurrir cuando quieres mejorar los resultados de consultas a la Base de Datos y conversaciones entre compañeros de profesión. Normalmente cuando te preguntas ¿cómo puedo hacer que estos no me arroje tantas queries en una consulta que estoy haciendo?  o ¿Cómo puedo hacer que entre dos tablas sacar algunos campos que sólo me interesan extraer esos datos y no todos?

Para lo que voy a exponer, necesito ponerte en situación. Las tablas que necesitamos son, productos en nuestro modelo Product y que tendremos asociadas unas categorías en una tabla de categorías en nuestro modelo de Category  y tendremos que también puede darse el caso que necesitemos crear comentarios a nuestros productos y en ese caso tendremos nuestra tabla de comentarios en nuestro modelo de Review y claro está que no nos podía faltar nuestros usuarios en el modelo User. Bien con esto ya tenemos definido nuestro schema de la base de datos con la que vamos a trabajar.
Seguir leyendo

Mi guía para especificar las relaciones en los modelos: Active Record – RubyOnRails

Beer on RailsEn esta guía de referencia, quiero hablar sobre las relaciones en los modelos de RubyOnRails, que además considero que hay que tener las ideas y los conceptos muy claros para poder trabajar con soltura. Nuestro protagonista de esta sesión es Active Record. Cuando venimos de otros lenguajes y modelados de Bases de Datos en los que uno mismo tiene que pensar en muchos detalles y como todo, en un primer encuentro, incluso en alguno que otro más con Active Record, tienes que cambiar la forma de pensar y de aprender. Pues como digo, hay que cambiar la forma de pensar y enfocar las relaciones para que no tengas confusiones y esto te lleve a problemas, hay pensar que estamos tratando con objetos de modelo y sus relaciones y no con filas y columnas ya que parte de la magia de ORM es que puede convertir las relaciones de clave externa hacia otra tabla referenciada Foreign Key en mapeos entre objetos de alto nivel o un lenguaje natural y ayudar a que Active Record entienda las relaciones que queremos abordar en nuestra Base de Datos.

Para eso tenemos las relaciones mediante claves externas que hacen que ORM entienda como se ven entra ellas y como podemos nosotros circular entre esas relaciones. Pongamos un ejemplo, si tenemos una tabla Productos y otra Categorías en la que necesitamos una tercera tabla denominada «Tabla de Unión», para relacionar ambos modelos de Productos y Categorías en la que tendremos por convención las claves id de ambas tablas, product_id y category_id, para que pueda relacionarlas RubyOnRails con ORM. La convención de nomenclatura Active Record dice que la columna clave externa debería llamarse después del nombre de la tabla destino y añadiendo el guión bajo más el id, tal como hemos visto anteriormente.

Es importante pensar en los índices que creemos para no ralentizar las búsquedas y por otro lado, en el caso de que utilicemos otros nombres que no sea capaz de reconocer automáticamente, deberemos declarar las Foreign Key, Seguir leyendo