Ruby on Rails - ¿Cómo encontrar los elementos que no tienen relación (con un estado activo)?

CorePress2024-01-25  10

¿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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare