Ruby on rails I';我不确定如何对以下数据结构建模

Ruby on rails I';我不确定如何对以下数据结构建模,ruby-on-rails,Ruby On Rails,我对一些数据建模有困难。我不确定我是否应该使用多态关系、多个模型,或者对我的数据进行非规范化 我想记录一个练习的“日志”。我还想记录我的饮食记录 因此,如果我记录一组台式压力机,我会记录重量/重复次数。我也可能会记录下我一餐的宏观数据,300卡路里,5卡路里,5脂肪 这应该是一个称为“日志”的模型吗 Log=>体重/重复次数/卡路里/碳水化合物/脂肪 它可能记录的不仅仅是运动的重量。潜在距离也存在,所以您也可以将距离和持续时间添加到该模型中 最重要的是,如果一个人要记录他们的饮食,日志应该属于与

我对一些数据建模有困难。我不确定我是否应该使用多态关系、多个模型,或者对我的数据进行非规范化

我想记录一个练习的“日志”。我还想记录我的饮食记录

因此,如果我记录一组台式压力机,我会记录重量/重复次数。我也可能会记录下我一餐的宏观数据,300卡路里,5卡路里,5脂肪

这应该是一个称为“日志”的模型吗

Log=>体重/重复次数/卡路里/碳水化合物/脂肪

它可能记录的不仅仅是运动的重量。潜在距离也存在,所以您也可以将距离和持续时间添加到该模型中

最重要的是,如果一个人要记录他们的饮食,日志应该属于与饮食相关的哪个模型


小结:用户应该能够记录他们进行的运动的日志,包括重复次数、体重、距离和持续时间。用户还应该能够在一天中进食时记录宏。是否应该有一个通用的日志模型?


澄清:锻炼是一系列练习的集合。练习有点像跑步或台式压力机。

就个人而言,我宁愿把它们分开,这样代码就非常清晰了

用户提供的餐

锻炼与属于用户的锻炼&
锻炼

训练用户提供所属的训练

演习将包括

weight
reps
distance
duration
因此,它将涵盖基于时间的距离元素,如自行车或慢跑,以及重量和重复次数

让您轻松检索和创建新数据

user.meals && user.meals.build
workout.exercises &&  workout.exercises.build

如果您所做的只是从其他模型计算属性,那么我不理解使用日志模型的意义。所以我会这样设置:

Class User
# t.integer  :weight  (or if this can change regularly make this an attribute of meal and     exercise so it's calculated and is logged specifically for those things)
has_many :meals
has_many :workouts
has_many :exercises, through: :workouts

class Meal
# t.integer :carbs
# t.integer :calories
# t.integer :fat   etc
belongs_to :user

class Workout
belongs_to :user
has_many :exercises

class Exercise
# t.integer :reps
# t.integer :duration
# t.integer :distance
# t.integer :barbell_weight  etc
belongs_to :workout
因此,这些模型本质上就是日志,如果你想记录“基于用户体重的卡路里燃烧”等,那么你可以根据计算动态创建“日志”类型的电子表格。如果你想知道每顿饭/每项运动的计算结果,那么我会将用户体重作为每顿饭和运动/锻炼的一个属性,这样你就可以知道在用户一年的健身计划中,在特定时间消耗了多少卡路里

根据评论进行编辑:

class User
  has_many :logs

class Log
  belongs_to :exercise
  belongs_to :user

如果您还希望以类似的方式跟踪膳食日志(如中所述,膳食与为其记录的信息非常不同)。然后我会做一个多态的。但实际上,这是非常具体的情况,所以你最了解你的应用程序,你需要做出决定。

我不理解练习部分。为什么运动会有重量/重复次数/距离/持续时间。运动有点像“卧推”或“跑步”。因此,记录模型必须属于练习和用户。所以你认为它应该类似于user.exercise\u日志?(一项训练应该是一系列训练的集合)。但是一项训练不会有重复次数/持续时间/距离,因为一项训练是一项训练的名称,而不是记录。锻炼是一系列的锻炼。你把一个练习的记录叫做什么?你是说课堂练习的对象可以是“跑步”,然后用户可以选择“跑步”作为训练1的一部分,然后记录“5英里”和“45分钟”,然后在训练2中选择“跑步”,然后记录“3英里”和“20分钟”?如果是这样的话,我仍然没有一个日志模型,只是有一个“Type”属性用于练习,在这里你可以有一个包含不同选项的选择菜单,如“Running”、“Lifting”、“sweering”等(如果用户看不到他们想要什么,可以让用户添加他们自己的选项)。不。。。一个练习是跑步/卧推/仰卧起坐/引体向上。这是指定正在进行的练习。这样你就可以查看所说的练习,并查看你为此所做的所有日志。一个训练只是一组需要练习的集合……是的,所以如果你想查看你为练习“引体向上”所做的所有日志,那么只需搜索user.exercises.where(:type=>“引体向上”)。如果您的练习模型只具有属性“name”和许多实例:logs,而没有其他内容,那么这只是一种更长、更昂贵的方法,在我看来,这是非常迂回的。