¿Me gustaría encontrar todos los sitios que no tienen relación con un estatuto activo?
Site.joins(:site_links).where("site_links.active = ? ", true).group('sites.id').having('COUNT(site_links.*) = 0')
Por ejemplo, tengo un primer sitio que tiene 5 relaciones. En estas cinco relaciones, uno está activo. Tengo un segundo sitio que tiene 3 relaciones, pero ninguna de ellas está activa.
Me gustaría obtener sólo el segundo sitio.
class Site < ApplicationRecord
has_many :site_links, dependent: :destroy
has_many :links, through: :site_links
end
class SiteLink < ApplicationRecord
belongs_to :site
belongs_to :link
end
class Link < ApplicationRecord
has_many :site_links, dependent: :destroy
has_many :sites, through: :site_links
end
¿Cuál es tu versión de Rails y cómo se relacionan tus modelos?
Sebastián Palma
28/03/2021 a las 15:07
Rails 6.1.3 y agregué el modelo relacionado ;)
- Ben
28/03/2021 a las 18:37
------------------------------------
Puedes usar SQL NO EXISTE
Site.where("NOT EXISTS (SELECT *
FROM site_links
WHERE (site_id = sites.id)
AND active = true)")
4
Solo el primer método devuelve el resultado atendido;)
- Ben
29/03/2021 a las 16:47
@Ben el segundo me funciona. ¿Podría compartir el SQL generado por la segunda consulta?
Sampat Badhe
30/03/2021 a las 14:19
SELECCIONE "sitios".* DE "sitios" UNIÓN EXTERNA IZQUIERDA "enlaces_sitio" EN "enlaces_sitio"."id_sitio" = "sitios"."id" DONDE "enlaces_sitio"."activos" != $1 [["actuar"ive", verdadero]]
- Ben
31 de marzo de 2021 a las 9:12
Sí, tienes razón, eliminé la consulta left_outer_join de la respuesta.
Sampat Badhe
31/03/2021 a las 11:30
------------------------------------
Si has configurado la asociación has_many correctamente, puedes hacer esto
Site.includes(:site_links).where.not(site_links: { active: true })
4
incluye cargas de registros asociados por adelantado
-Taoufik
29 de marzo de 2021 a las 8:10
¿Por qué no es necesario? Comprobamos si los enlaces de sitio asociados están activos o no. La pregunta relacionada es cuáles son las inclusiones o uniones más eficaces. Puede encontrar la respuesta en este artículo
-Taoufik
M29 de marzo de 2021 a las 10:20
incluye generar una consulta que contiene una UNIÓN EXTERNA IZQUIERDA mira esto
-Taoufik
29 de marzo de 2021 a las 11:56
1
La primera es correcta, así que actualizaré mi respuesta, gracias @SebastianPalma
-Taoufik
29 de marzo de 2021a las 12:21