Непосредственно перед тем, как я отвечу, я хочу указать, что типичное соглашение ruby (которое актуально для DataMapper, которое вы увидите через секунду) - это иметь имена классов, такие как SelectedWorkout и WorkoutItem, а не Selectedworkout и Workoutitems.DataMapper автоматически называет ваши отношения по именам классов, поэтому полезно следовать соглашению.Извиняюсь, если это сбивает с толку, но с целью ответа, я собираюсь предположить, что вы можете переименовать ваши модели:
Учитывая, что ваша модель тренировки является по сути нормализованным сбором данных из WorkoutItem, я быпредположим, что WorkoutItem.belongs_to(:workout)
(и, кстати, это команда, которую вы можете запустить из IRB, и она будет работать просто отлично, или вы можете вставить belongs_to :workout
в класс модели, конечно).
Кажется, чтоSelectedWorkout является вашим основным интерфейсом в ваших данных, поэтому я предполагаю, что вы будете делать такие вещи, как: @user.selected_workouts.first.workout_items
(для элементов первой выбранной тренировки) или тому подобное.
Кстати, вы можете пойти дальше и использовать WorkoutItemв качестве модели соединения между Workout и SelectedWorkout, если установлены следующие отношения:
WorkoutItem.belongs_to(:workout)
WorkoutItem.belongs_to(:selected_workout)
SelectedWorkout.has(Infinity, :workout_items) # n == Infinity inside a Model
Как только предыдущее отношение установлено, вы можете сказать:
SelectedWorkout.has(Infinity, :workouts, :through => :workout_items)
Аналогично вы настраиваете другую сторону, у которой есть много сквозных отношений аналогично:
Workout.has(Infinity, :workout_items)
Workout.has(Infinity, :selected_workouts, :through => :workout_items
Теперь вы можете делать классные вещи, как @selected_workout.workouts.map{ |w| w.name }
.Или, если вы хотите найти все выбранные тренировки, которые включают в себя определенную тренировку, вы можете сказать @workout.selected_workouts
.
, или вы можете делать более интересные вещи с помощью синтаксиса запроса DataMapper, например:
@workouts_that_dont_require_gear = SelectedWorkouts.all("workouts.name" => ["Situps", "Pullups", "Pushups"])