如何批量分配然后单独编辑

时间:2010-03-05 13:38:04

标签: ruby-on-rails database database-design schema

背景:我有一个运动员的应用程序,每个运动员(运动员模型)都可以分配锻炼(锻炼模型,通过模型锻炼分配)。

问题:起初我认为通过锻炼分配和通过exercise_assignment让很多运动员进行锻炼的运动员进行多次锻炼可以很好地适应我。如果我这样做的话,如果我为50名运动员分配了一项训练,那么他们都会参考相同的训练记录。我希望教练(指定训练的人)能够为50名运动员分配相同的训练,但如果他愿意,可以逐个改变他们(为运动员定制)。有没有人就如何处理这个问题向我提出建议?我是否需要创建50份锻炼副本并将其分配给用户,如果我有单独的锻炼,我是否真的需要通过模型进行exercise_assignment?

感谢您提供任何建议!

架构:

  create_table "athletes", :force => true do |t|
    t.string   "name"
    t.string   "username"
    t.string   "password"
    t.string   "sport"
    t.text     "notes"
    t.integer  "coach_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
  end

  create_table "coaches", :force => true do |t|
    t.string   "name"
    t.string   "username"
    t.string   "password"
    t.string   "address"
    t.string   "city"
    t.string   "state"
    t.string   "zipcode"
    t.string   "phone"
    t.string   "sports"
    t.integer  "experience"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
  end

create_table "workout_assignments", :force => true do |t|
    t.integer  "athlete_id"
    t.integer  "workout_id"
    t.date     "date_assigned"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "workouts", :force => true do |t|
    t.string   "name"
    t.string   "type"
    t.integer  "coach_id"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "category_id"
  end

模型关联:

class Athlete < ActiveRecord::Base
  belongs_to :coach
  has_many :workouts, :through => :workout_assignments
end

class Workout < ActiveRecord::Base
  has_many :athletes, :through => :workout_assignments
  belongs_to :category
end

class WorkoutAssignment < ActiveRecord::Base
  belongs_to :workout
  belongs_to :athlete
end

class Coach < ActiveRecord::Base
  has_many :athletes
  has_many :workouts
end

1 个答案:

答案 0 :(得分:2)

使用has和属于关系的原因(通过互惠:通过关系或其他方式)是重用任何一方的对象。

您是否考虑过使用丰富的连接模型?您的workout_assignments模型似乎已经是“date_assigned”列。理论上,您的连接模型包含特定于该分配的数据。这样,您只需要每个常用锻炼元素的一个副本,并使用锻炼分配模型来存储各个指令。

以下是我建议实施此内容的方法:

调整exercise_assignments以包含运动员的特殊说明。您需要做的就是在workout_assignments表中添加一列,我将其称为special_instructions,但您可以随意调用它。

在新迁移的up方法中:

add_column :workout_assignments, :special_instructions, :string

就是这样。在向运动员/教练展示锻炼时,除了锻炼的描述之外,还不一定要显示特殊说明。有些事情可以帮助您轻松转换参考workout_assignments来代替锻炼。

查看has_many关联的委托,自定义访问器和:include选项的用法。了解如何使这些模型更好地协同工作。我们的想法是,您可以在加载锻炼任务时随时加载相关的锻炼。

委托是一种允许您将方法传递给其他选项的技术。从本质上讲,给出了合并两个模型的外观。在它最简单的形式,它看起来像这样:

def description
  workout.description
end

然后在exercise_assignments上编写一个自定义访问器,以获取相关工作的描述,并将其显示在工作分配的特殊说明旁边。