Donde como consulta con matriz

Tengo un modelo de seguimiento con 4 columnas de valores de cadena separados por comas que deben poder buscarse por cualquier número de términos.

p.ej

Track.first.genre => "Alternative, Lite Rock, Indie Rock, Psychedelic"
Track.first.mood => "Aggressive, Angry, Dark, Driving, Energetic, Heavy"
Track.first.tempo => "Fast, Medium"
Track.first.artist => "something"

Luego, un usuario puede usar cualquier número de términos para reducir la lista de pistas mostradas. Estoy recopilando los términos en matrices que coinciden con cada columna. p.ej

genres = params[:genre].split(",")
moods = params[:mood].split(",")

y así. Entonces, si los géneros => ["Rock", "Alternativa"], eso coincidiría con todas las Pistas que contienen cualquiera de esos términos en la columna de género, y todos los términos adicionales se seleccionarían de esa matriz devuelta, y así sucesivamente para cada uno de los 4 columnas

¿Cuál es la mejor manera de hacer esto y cómo escribo una consulta where usando like con una matriz como condición?

preguntado el 12 de junio de 12 a las 20:06

Creo que podrías necesitar reevaluar tus entidades y relaciones... Parece que los géneros/estados de ánimo/tempi tienen una relación de muchos a muchos con las pistas. -

@PlatinumAzure: esos son todos los atributos del modelo Track. Originalmente, cada una iba a ser una sola cadena, pero desde entonces el cliente ha agregado varias cadenas en cada columna, lo que hace que mi consulta ("género en (?)", géneros) quede inutilizable. -

Estoy diciendo que su diseño (teniendo esos atributos del modelo de pista) probablemente necesite ser reelaborado. Deben ser sus propios modelos. Me lo agradecerás más tarde. -

De acuerdo con PA. Una vez que el cliente agregó el requisito de múltiples géneros, la solución correcta sería dividir esa relación en muchos a muchos con géneros en su propia tabla. -

1 Respuestas

^ Considere usar modelos para el género, el estado de ánimo y el tempo. ActiveRecord hará que las consultas que los involucran sean mucho más fáciles.

^ El serialize declaración podría ahorrarle algo de traducción.

^ Puede buscar los elementos de la matriz que desee con su llamada where, por ejemplo:

class Track < ActiveRecord::Base
  def self.for_genre(name)
    where "genre like '%#{name}%'"
  end
end

Esto significa elegir nombres que no sean subcadenas de otros nombres.

Respondido el 13 de junio de 12 a las 04:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.