我刚刚深入研究 Datamapper(和 Sinatra)并且有一个关于关联的问题。下面是我有的一些模型。这就是我想要实现的。我对 Workoutitems 和 Workout 有疑问。锻炼将单独管理,但 Workoutitems 的每一行都有一个锻炼。
- 锻炼 - 只是一系列类型 锻炼(运行、举重、仰卧起坐等)
- 选定的锻炼 - 这个 是一组锻炼的名称, 连同用户的注释和 培训师。它有一个集合 N 锻炼项目
锻炼项目 - 这需要锻炼和锻炼集中的重复次数。
class Workout include DataMapper::Resource property :id, Serial #PK id property :name, String, :length=>50,:required=>true # workout name property :description, String, :length=>255 #workout description end class Selectedworkout include DataMapper::Resource property :id, Serial property :name, String, :length=>50, :required=>true property :workout_time, String, :length=>20 property :user_notes, String, :length=>255 property :coach_notes, String, :length=>255 has n, :workoutitems end class Workoutitem include DataMapper::Resource property :id, Serial property :reps, String, :length=>50, :required=>true belongs_to :selectedworkout end
最佳答案
在我回答之前,我要指出典型的 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)
同样,您也可以类似地设置 has many through 关系的另一端:
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"=> ["仰卧起坐", "引体向上", "俯卧撑"])
关于ruby - 从Datamapper开始,关联问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2826439/