Rails 关联 has_many 通过而不是 HABTM

Sin*_*ina 5 ruby activerecord ruby-on-rails

我对 Rails 和 ActiveRecord 还很陌生,我正在尝试找到对数据建模的正确方法。

我正在构建一个应用程序,让我们的游泳教练制定一个课程计划,显示他们将教授他们的课程的技能以及他们将使用哪些活动来教授每项技能。一个计划可以包含许多技能,每个技能可以有许多与之相关的活动。

在“计划”表单上,有一个用于技能-活动组合的小部件。在其中,用户应该能够从下拉列表中选择一项技能,并为所选技能从列表中选择多个活动。此小部件可以在表单上重复任意次数。

我现在的型号:

Class Plan
  has_many :plan_activities
end

Class PlanActivities
  belongs_to :plan
  belongs_to :skill
  has_and_belongs_to_many :activities
end

Class Skill
end

Class Activity
end
Run Code Online (Sandbox Code Playgroud)

这个模型正确吗?我的问题是accepts_nested_attributes_for 不适用于HABTM 关联。我读过我可以通过 has_many 替换它:,但这意味着向图片添加另一个连接模型。只是看起来有点太丑了。有一个更好的方法吗?

编辑:

我的技能和活动采用列表形式,我应该能够在多个计划中包含相同的技能和/或活动。

dan*_*zzz 0

你的模型非常接近。这里的一项改进是完全删除 PlanActivities 模型。只需将协会直接纳入计划即可。在这一点上,我认为额外的模型是不合理的。我们这里有一个非常基本的金字塔结构。顶部是包含许多技能的计划,每个技能都有许多活动,因此一个更简单的模型如下所示:

class Plan
  has_many :plan_skills
  has_many :activities, through: :plan_skills
end

class Skill
  has_many :activities, through: plan_skills
  has_many :plan_skills

end

class PlanSkill
  belongs_to :plan
  belongs_to :skill
  has_many :activities
end


class Activity
  belongs_to :plan_skill
end
Run Code Online (Sandbox Code Playgroud)

连接模型是一种选择,但在这里并非完全必要。Plan.activities 将为您制作所需的联接表。