加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 从Datamapper开始,关联问题

发布时间:2020-12-17 02:26:59 所属栏目:百科 来源:网络整理
导读:我只是潜入Datamapper(和Sinatra)并对关联有疑问.以下是我的一些型号.这就是我想要实现的.我在Workoutitems和Workout方面遇到了问题.锻炼将单独管理,但Workoutitems只有一个与每行相关的锻炼. 锻炼 – 只是一个类型的列表 锻炼(跑步,举起,仰卧起坐等) 选择锻
我只是潜入Datamapper(和Sinatra)并对关联有疑问.以下是我的一些型号.这就是我想要实现的.我在Workoutitems和Workout方面遇到了问题.锻炼将单独管理,但Workoutitems只有一个与每行相关的锻炼.

>锻炼 – 只是一个类型的列表
锻炼(跑步,举起,仰卧起坐等)
>选择锻炼 – 这个
是一组训练的名称,
以及用户的笔记和
教练.它有一个N的集合
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”])

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读