Estoy tratando de encontrar una buena (y rápida) solución al siguiente problema:
Tengo dos modelos con los que estoy trabajando, llamémosles jugadores y equipos. Un jugador puede estar en varios equipos y un equipo puede tener varios jugadores). Estoy trabajando en la creación de un elemento de interfaz de usuario en un formulario que permita a un usuario seleccionar varios equipos (casillas de verificación). A medida que el usuario selecciona (o deselecciona) equipos, me gustaría mostrar los equipos agrupados por jugadores.
Entonces, por ejemplo:
Si los equipos seleccionados no tienen jugadores que se crucen, cada equipo tendrá su propia sección.
Si el usuario selecciona dos equipos y tienen los mismos jugadores, habría una sección que contiene los nombres de los dos equipos y todos los jugadores.
Si TEAM_A tiene jugadores [1, 2, 4, 5] y TEAM_B tiene jugadores [1, 3, 5, 6]. Habría las siguientes secciones: SECTION_X = [TEAM_A, TEAM_B, 1, 5], SECTION_Y = [TEAM_A, 2, 3], SECTION _Z = [TEAM_B, 3, 5]
Espero que sea claro. Esencialmente, quiero encontrar los equipos que los jugadores tienen en común y agrupar por eso. Estaba pensando que tal vez hay una manera de hacer esto navegando en un gráfico bipartito. Sin embargo, no estoy seguro de cómo y podría estar pensando demasiado. Esperaba hacer esto creando algún tipo de estructura de datos en el servidor y usándolo en el cliente. ¡Me encantaría escuchar tus sugerencias y agradezco cualquier ayuda que puedas dar!
Team
debe tener un campo llamadoplayers
que requiera una relación de muchos a muchos con su otro modeloPlayer
. Esto le permite recuperar qué jugadores están en cada equipo y qué equipos están asociados a cada jugador.Respuestas:
¿Has oído hablar del gráfico de intersección ? Puedes intentar dibujar jugadores como puntos, conexiones (compañeros de equipo) como bordes y equipos como manchas de colores transparentes en la parte superior.
En cuanto a su pregunta original, no puedo entender su objetivo. Creo que su formulación no está bien definida / incompleta. Suponga que tiene los equipos A [1,2] B [2,3] y C [1,3]. ¿Qué quieres mostrar? ¿Desea enumerar las partes del diagrama de Venn? Creo que para más de 3 series esto puede volverse más engorroso que el gráfico bipartito en sí mismo = listado simple de composiciones de equipo.
fuente
Almacene los bordes (relaciones) en su servidor:
Cuando desee encontrar elementos comunes, simplemente filtre todos los bordes donde:
(Podría usar índices para acelerar, etc.)
Luego, agrupe por ID de jugador y verifique cuántos elementos hay en cada grupo. Los grupos con dos elementos pertenecen a ambos equipos y son compartidos.
fuente