【问题标题】:Beginning with Datamapper, Association question从 Datamapper 开始,关联问题
【发布时间】:2023-03-26 01:50:02
【问题描述】:

我刚刚深入研究 Datamapper(和 Sinatra),并且对关联有疑问。下面是我的一些模型。这就是我想要实现的。我对锻炼项目和锻炼有疑问。锻炼将单独管理,但锻炼项目与每一行关联一个锻炼。

  1. 锻炼 - 只是类型的列表 锻炼(跑步、举重、仰卧起坐等)
  2. 选定的锻炼 - 这个 是一组锻炼的名称, 连同用户的注释和 教练。它有 N 个集合 锻炼项目
  3. 锻炼项目 - 这需要锻炼并在锻炼集中进行多次重复。

    课堂锻炼 包括 DataMapper::Resource 属性:id,序列号#PK id property :name, String, :length=>50,:required=>true # 锻炼名称 属性 :description, String, :length=>255 #workout 描述 结尾 类Selectedworkout 包括 DataMapper::Resource 属性:id,序列号 属性 :name, String, :length=>50, :required=>true 属性 :workout_time, 字符串, :length=>20 属性 :user_notes, 字符串, :length=>255 属性:coach_notes,字符串,:长度=> 255 有 n, :workoutitems 结尾 类锻炼项目 包括 DataMapper::Resource 属性:id,序列号 属性 :reps, String, :length=>50, :required=>true 属于_to :selectedworkout 结尾

【问题讨论】:

    标签: ruby associations datamapper


    【解决方案1】:

    就在我回答之前,我要指出典型的 ruby​​ 约定(与 DataMapper 相关,您稍后会看到)是具有类名称,如 SelectedWorkout 和 WorkoutItem,而不是 Selectedworkout 和 Workoutitems。 DataMapper 会根据类名自动命名您的关系,因此遵循约定很有用。抱歉,如果它令人困惑,但为了回答的目的,我假设您可以重命名您的模型:

    鉴于您的 Workout 模型本质上是来自 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"])

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多