sql - dates - Rails, Ransack: Cómo buscar la relación HABTM para "todos" los partidos en lugar de "cualquiera"
ransack rails tutorial (1)
Con un predicado de rancheo personalizado definido como en mi respuesta a su pregunta relacionada, esto debería funcionar con un simple cambio en su marcado:
- terms.each do |t|
= check_box_tag ''q[id_has_terms][]'', t.id
ACTUALIZAR
El :formatter
no hace lo que yo pensaba, y dado que el repositorio de Ransack no hace ni una sola mención de "subconsulta", es posible que no puedas usarlo para lo que intentas hacer, después de todo. Todas las opciones disponibles parecen estar agotadas, por lo que no habría nada más que hacer que el parche de mono.
¿Por qué no saltear el saqueo y consultar la tabla de "fotos" como lo harías normalmente con el registro activo (o incluso con la consulta Arel que ahora tienes)? Ya sabes que la consulta funciona. ¿Hay algún beneficio específico que espera obtener del uso de Ransack?
Me pregunto si alguien tiene experiencia en usar Ransack con relaciones HABTM. Mi aplicación tiene photos
que tienen una relación habtm con los terms
(los términos son como etiquetas). Aquí hay una explicación simplificada de lo que estoy experimentando:
Tengo dos fotos: Foto 1 y Foto 2. Tienen los siguientes términos:
Foto 1: A, B, C
Foto 2: A, B, D
Construí una forma de saqueo, y hago casillas de verificación en el formulario de búsqueda para todos los términos, así:
- terms.each do |t|
= check_box_tag ''q[terms_id_in][]'', t.id
Si uso: q[terms_id_in][]
y q[terms_id_in][]
"A, C" mis resultados son Foto 1 y Foto 2. Solo quiero la Foto 1, porque pedí A y C, en esta consulta no me importa B o D pero quiero que tanto A como C estén presentes en un resultado dado.
Si uso q[terms_id_in_all][]
mis resultados son nulos, porque ninguna de las fotos incluye solo A y C. O, quizás, porque solo hay un término por combinación, por lo que ninguna combinación coincide con A y C. De todos modos, solo quiero foto 1 para ser devuelto
Si uso cualquier variedad de q[terms_id_eq][]
nunca obtengo ningún resultado, así que no creo que funcione en este caso.
Entonces, dada una unión habtm, ¿cómo se buscan modelos que coincidan con los valores dados mientras se ignoran los valores no dados?
O, para cualquier gurú de rails / sql que no esté familiarizado con Ransack, ¿de qué otro modo podría crear un formulario de búsqueda como el que describo para un modelo con una combinación de habtm?
Actualización: según la respuesta a una pregunta relacionada , ahora he llegado a construir una consulta Arel que coincida correctamente con esto. De alguna manera, se supone que debes poder utilizar los nodos de Arel como saqueadores, o como señalaron los deshielos, como predicados personalizados, pero hasta ahora no he conseguido que funcionen.
Por esa respuesta, configuré el siguiente inicializador de registros:
Ransack.configure do |config|
config.add_predicate ''has_terms'',
:arel_predicate => ''in'',
:formatter => proc {|term_ids| Photo.terms_subquery(term_ids)},
:validator => proc {|v| v.present?},
:compounds => true
end
... y luego configure el siguiente método en Foto:
def self.terms_subquery(term_ids)
photos = Arel::Table.new(:photos)
terms = Arel::Table.new(:terms)
photos_terms = Arel::Table.new(:photos_terms)
photos[:id].in(
photos.project(photos[:id])
.join(photos_terms).on(photos[:id].eq(photos_terms[:photo_id]))
.join(terms).on(photos_terms[:term_id].eq(terms[:id]))
.where(terms[:id].in(term_ids))
.group(photos.columns)
.having(terms[:id].count.eq(term_ids.length))
).to_sql
end
Lamentablemente, esto no parece funcionar. Mientras terms_subquery
produce el SQL correcto, el resultado de Photo.search(:has_terms => [2,5]).result.to_sql
es simplemente "SELECT /"photos/".* FROM /"photos/" "