ruby – 从Datamapper开始,关联问题
我只是潜入Datamapper(和Sinatra)并对关联有疑问.以下是我的一些型号.这就是我想要实现的.我在Workoutitems和Workout方面遇到了问题.锻炼将单独管理,但Workoutitems只有一个与每行相关的锻炼.
>锻炼 – 只是一个类型的列表 class Workout include DataMapper::Resource property :id,Serial #PK id property :name,String,:length=>50,:required=>true # workout name property :description,:length=>255 #workout description end class Selectedworkout include DataMapper::Resource property :id,Serial property :name,:required=>true property :workout_time,:length=>20 property :user_notes,:length=>255 property :coach_notes,:length=>255 has n,:workoutitems end class Workoutitem include DataMapper::Resource property :id,Serial property :reps,:required=>true belongs_to :selectedworkout end 解决方法
就在我回答之前,我将指出典型的ruby约定(与您在一秒钟内看到的DataMapper相关)是具有类名称如SelectedWorkout和WorkoutItem,而不是Selectedworkout和Workoutitems. DataMapper从类名自动命名您的关系,因此遵循约定很有用.抱歉,如果它令人困惑,但为了答案的目的,我将假设您可以重命名您的模型:
鉴于您的Workout模型本质上是来自WorkoutItem的标准化数据集合,我建议使用WorkoutItem.belongs_to(:exercise)(顺便说一下,这是一个可以从IRB运行的命令,它可以正常工作,或者你可以坚持使用belongs_to:在模型课中锻炼). 看起来SelectedWorkout是你数据的主要接口,所以我认为你会做的事情就像说@ user.selected_workouts.first.workout_items(对于第一个选择的锻炼项目)等. 顺便提一下,如果设置了以下关系,您可以更进一步,并使用WorkoutItem作为Workout和SelectedWorkout之间的连接模型: WorkoutItem.belongs_to(:锻炼) WorkoutItem.belongs_to(:selected_workout) SelectedWorkout.has(Infinity,:workout_items)#n ==模型中的无穷大 设置上一个关系后,您可以说: SelectedWorkout.has(无限,:锻炼,:通过=>: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”]) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |