ruby - 从Datamapper开始,关联问题

标签 ruby associations datamapper

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

  1. 锻炼 - 只是一系列类型 锻炼(运行、举重、仰卧起坐等)
  2. 选定的锻炼 - 这个 是一组锻炼的名称, 连同用户的注释和 培训师。它有一个集合 N 锻炼项目
  3. 锻炼项目 - 这需要锻炼和锻炼集中的重复次数。

    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/

相关文章:

java - @OneToOne/@ManyToOne/@ManyToMany 的非拥有实体方

mysql - 使用 DataMapper 选择随机数据

ruby - 使用 sinatra 和 datamapper 进行延迟注册

ruby - 延续可以用来代替递归吗?

ruby - Rubocop:当只发现警告时,是否可以告诉 Rubocop 返回零作为退出代码?

ruby-on-rails - will_paginate - 关联

ruby - 在 datamapper (ruby) 中使用 SQL 函数作为字段分组

mysql - 在 Rails 中将两个表与迁移相关

ruby - 在 Ramaze 的父目录中渲染部分内容

mysql - 在 Rails 中组合多个模型