Muchos de nosotros sabemos acerca de las inclusiones, las uniones, pero a veces nos confundimos acerca de su uso. Mientras experimentaba con la refactorización de código en uno de mis proyectos, allí probé estas cosas. Así que pensé que podía compartir estos hallazgos con ustedes.
Como sabemos, include y join se usan cuando realizamos operaciones en tablas asociadas. Ambos se utilizan para el mismo propósito.
Incluye : utiliza carga ansiosa. Cuando queremos obtener datos junto con una tabla asociada, se debe usar incluye.
Uniones: utiliza carga diferida. Podemos usar uniones cuando queremos considerar los datos como una condición de la tabla unida pero sin usar ningún atributo de la tabla.
Te mostraré un ejemplo en el que se prefiere incluir en lugar de unir, ¡también he comparado ambas consultas para que puedas ver cuál es más rápida!
class Item < ApplicationRecord belongs_to : user end class User < ApplicationRecord has_many : items , dependent : : destroy end
Ahora quiero mostrar el título del elemento con el nombre del usuario.
El uso de include será el resultado de la consulta,
puts Benchmark.measure { items = Item.includes(:user) items.each do |item| item.title item.user.first_name end }
El uso de resultados de consulta de combinaciones será,
puts Benchmark.measure { items = Item.joins(:user) items.each do |item| item.title item.user.first_name end }
Por lo tanto, se explica por sí mismo, se prefiere incluir. Pero si queremos tener elementos donde user_id: 1, y no estamos mostrando ningún dato de la tabla de Usuario, entonces solo use uniones, porque esto no cargará los datos de ningún usuario hasta que queramos (carga diferida). Como se indica a continuación.
items = Item.joins(:user).where(user_id: 1 ) items.each do |item| item.title end
A continuación se muestran algunos enlaces de referencia. Puedes verlos para tu comprensión:
http://railscasts.com/episodes/181-include-vs-joins?autoplay=true