背景:我有一个运动员的应用程序,每个运动员(运动员模型)都可以分配锻炼(锻炼模型,通过模型锻炼分配)。
问题:起初我认为通过锻炼分配和通过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
答案 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上编写一个自定义访问器,以获取相关工作的描述,并将其显示在工作分配的特殊说明旁边。