Comenzando con Datamapper, pregunta de asociación
Frecuentes
Visto 846 equipos
4
Me estoy sumergiendo en Datamapper (y Sinatra) y tengo una pregunta sobre las asociaciones. A continuación se muestran algunos modelos que tengo. Esto es lo que quiero implementar. Tengo un problema con Workoutitems y Workout. El entrenamiento se administrará por separado, pero Workoutitems tiene un solo entrenamiento asociado con cada fila.
- Entrenamiento: solo una lista de tipos de entrenamientos (correr, levantar, abdominales, etc.)
- Entrenamiento seleccionado: este es el nombre de un conjunto de entrenamientos, junto con notas del usuario y del entrenador. Tiene una colección de N elementos de entrenamiento
Elementos de entrenamiento: esto requiere un entrenamiento y varias repeticiones que van en el conjunto de ejercicios.
class Entrenamiento incluye DataMapper :: Propiedad de recurso: id, Serial #PK id propiedad: nombre, Cadena,: longitud => 50,: requerido => verdadero # nombre de entrenamiento propiedad: descripción, Cadena,: longitud => 255 # final de descripción del entrenamiento class Selectedworkout incluye DataMapper :: Propiedad de recurso: id, Propiedad de serie: nombre, String,: length => 50,: required => true propiedad: workout_time, String,: length => 20 propiedad: user_notes, String,: length => 255 propiedad: coach_notes, String,: length => 255 has n,: workoutitems end class Workoutitem include DataMapper :: Resource property: id, Serial property: reps, String,: length => 50,: required => true pertenece_ a: selectedworkout final
1 Respuestas
4
Justo antes de responder, voy a señalar que la convención típica de ruby (que es relevante para DataMapper que verá en un segundo) es tener nombres de clase como SelectedWorkout y WorkoutItem, en lugar de Selectedworkout y Workoutitems. DataMapper nombra sus relaciones automáticamente a partir de nombres de clases, por lo que es útil seguir la convención. Disculpas si es confuso, pero para el propósito de la respuesta, asumiré que puedes cambiar el nombre de tus modelos:
Dado que su modelo de entrenamiento es en esencia una colección normalizada de datos de WorkoutItem, sugeriría que WorkoutItem.belongs_to(:workout)
(y dicho sea de paso, ese es un comando que puede ejecutar desde IRB, y funcionaría bien, o puede pegar el belongs_to :workout
en la clase modelo, por supuesto).
Parece que SelectedWorkout es su interfaz principal en sus datos, así que supongo que estará haciendo cosas como decir @user.selected_workouts.first.workout_items
(para los elementos del primer entrenamiento seleccionado) o similares.
Por cierto, puede ir más allá y usar WorkoutItem como un modelo de unión entre Workout y SelectedWorkout, si se configuran las siguientes relaciones:
WorkoutItem.belongs_to(:workout)
WorkoutItem.belongs_to(:selected_workout)
SelectedWorkout.has(Infinity, :workout_items) # n == Infinity inside a Model
Una vez establecida la relación anterior, puede decir:
SelectedWorkout.has(Infinity, :workouts, :through => :workout_items)
Del mismo modo, configura el otro lado de la relación tiene muchos a través de manera similar:
Workout.has(Infinity, :workout_items)
Workout.has(Infinity, :selected_workouts, :through => :workout_items
Ahora puedes hacer cosas interesantes como @selected_workout.workouts.map{ |w| w.name }
. O si desea encontrar todos los entrenamientos seleccionados que incluyen un entrenamiento en particular, puede decir @workout.selected_workouts
.
O puede hacer cosas más interesantes a través de la sintaxis de consulta de DataMapper como esta:
@workouts_that_dont_require_gear = SelectedWorkouts.all("workouts.name" => ["Situps", "Pullups", "Pushups"])
contestado el 13 de mayo de 10 a las 19:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby associations datamapper or haz tu propia pregunta.