我坚持这个:
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'之间通过关系设置Skill
和Job
之间的多对多?
我的问题有三个部分
这是我正在尝试做的图片(各种各样),希望它有帮助...... :(
答案 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
这是关于每次遍历的明确说明并命名它。如果你发现通过你的系统的这些路径变得非常长,我会认为这是一种气味。可能有更直接的方式来获取数据,或者可能是更好的方法来建模。