Rails 4已经很多了

时间:2014-07-31 17:05:24

标签: ruby-on-rails has-many-through

我坚持这个:

class Worker < ActiveRecord::Base
  has_many :skills
  has_many :jobs, through: :skills
..
end

class Skill < ActiveRecord::Base
  belongs_to :worker
  has_many :jobs
..
end

class Job < ActiveRecord::Base
  has_many :skills
  has_many :workers, through: :skills
..
end

我想要做的是在`has_many'之间通过关系设置SkillJob之间的多对多?

我的问题有三个部分

  1. 这是可能的 - 使用has_many作业而不是belongs_to作业。
  2. 如果可以完成且代码错误,我该如何解决?
  3. 如何创建工人,技能和工作记录? (寻找语法)
  4. 这是我正在尝试做的图片(各种各样),希望它有帮助...... :(

    enter image description here

1 个答案:

答案 0 :(得分:2)

您没有提供有关您的人际关系的有效记录。每个:has_many都应该有一个对应的:belongs_to,以便活动记录知道哪个表包含每个关联的外键。请注意,您只有一个:belongs_to用于三种关系。闻起来。

至于解决问题,你至少有两个选择:

  • 添加:has_and_belongs_to_many个关联
  • 使用显式连接表

我倾向于后一种选择。被迫命名连接表通常可以澄清关系的本质。另一方面,我发现:has_and_belongs_to_many经常过于隐含,最终导致我的设计更加模糊。

显式联接表

您可以设置这样的关系(未经测试):

class Assignment < ActiveRecord::Base
  belongs_to :worker
  belongs_to :job
end

class Qualification < ActiveRecord::Base
  belongs_to :worker
  belongs_to :skill
end

class Worker < ActiveRecord::Base
  has_many :qualifications
  has_many :skills, through: :qualifications

  has_many :assignments
  has_many :jobs, through: :assignments
  ..
end

class Skill < ActiveRecord::Base
  has_many :qualifications
  has_many :workers, through: :qualifications
  has_many :jobs
  ..
end

class Job < ActiveRecord::Base
  has_many :skills
  has_many :workers, through: :assignments
  ..
end

通过使关系更加明确,我认为模型更清晰。从这里进行故障排除应该更容易。

修改

如果您需要执行Job.find(1).qualified_workers之类的遍历,请尝试对上述模型进行以下调整:

class Job
  has_many :required_competencies
  has_many :skills, through: :required_competencies
  has_many :qualifications, through: :skills
  has_many :qualified_workers, through: qualifications, class_name: :workers
end

class RequiredCompetency
  belongs_to :job
  belongs_to :skill
end

这是关于每次遍历的明确说明并命名它。如果你发现通过你的系统的这些路径变得非常长,我会认为这是一种气味。可能有更直接的方式来获取数据,或者可能是更好的方法来建模。