Tengo una tabla de calificadores que almacena varios términos utilizados para calificar películas. Algunos de ellos tienen un tipo :tag o :pool y pueden estar :active o no. Se atribuyen a las películas a través de una tabla de relaciones Movietags, relativa a una edición, que cambia cada año.
class Qualifier < ApplicationRecord has_many :movies has_many :qualifiers, through: :movietags has_many :movietags, inverse_of: :qualifier, dependent: :destroy ... end class Movietag < ApplicationRecord belongs_to :edition belongs_to :movie belongs_to :qualifier endMi objetivo es obtener todas las etiquetas activas (de ahí los dos alcances) junto con sus etiquetas de película de cualquier edición dada (y solo esas). Esta consulta funciona y realiza una UNIÓN EXTERNA IZQUIERDA, pero excluye los calificadores con etiquetas de película que no se usan en la edición dada:
@qualifiers = Qualifier.all_tags.active .includes(:movietags) .where('movietags.edition_id = ? OR movietags.edition_id IS NULL', @edition_id) .references(:movietags) -- irrelevant parts removed for legibility SELECT "qualifiers"."id" AS t0_r0, "qualifiers"."kind" AS t0_r1, "qualifiers"."active" AS t0_r2, "movietags"."id" AS t1_r0, "movietags"."edition_id" AS t1_r1, "movietags"."movie_id" AS t1_r2, "movietags"."qualifier_id" AS t1_r3 FROM "qualifiers" LEFT OUTER JOIN "movietags" ON "movietags"."qualifier_id" = "qualifiers"."id" WHERE "qualifiers"."kind" IN ('tag', 'pool') AND "qualifiers"."active" = $1 AND (movietags.edition_id = 5 OR movietags.edition_id IS NULL) [["active", "t"]]¿Cómo puedo obtener todas las etiquetas activas?
Estoy buscando una solución Rails pura, soy consciente de que las consultas SQL directas pueden lograr esto (ver comentarios, gracias @philipxy).