Ruby on rails Rails 4有很多到很多的功能
我被困在这个问题上:Ruby on rails Rails 4有很多到很多的功能,ruby-on-rails,has-many-through,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
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
class Worker
我想做的是通过关系在技能
和工作
之间建立多对多关系
我的问题有三个部分
您没有为active record提供足够的关系信息。每个
:has\u many
都应该有一个对应的:behing\u to
,以便active record知道哪个表包含每个关联的外键。请注意,对于三个关系,您只有一个:behing\u to
。这很难闻
至于解决问题,您至少有两种选择:
- 添加
:具有多个
关联,且属于多个
关联
- 使用显式联接表
:has_和\u belient_to_many
往往过于含蓄,最终使我的设计更加模糊
显式联接表
您可以这样设置关系(未经测试):
这是关于每个遍历的明确的,并命名它。如果你发现你的系统中的这些路径真的很长,我会认为这是一种气味。可能有更直接的方法来获取你的数据或者可能有更好的方法来建模它。
一个建议。如果你想在<代码>技能>代码>和<代码>作业< /代码>之间设置<代码>多到多个< /代码>,然后要么使用has_和\u belient_to_many
,要么正常的has_many:through
,但不要把两者都弄糟。所以我已经有了一个has_many through,它使用技能。通常会设置为属于jobs,而不是has_many jobs。所以我的问题是has_many jobs的使用在has_many的上下文中是否有效通过?如果是这样的话,你似乎建议通过使用技能、工作和其他尚未定义的类来创建另一个has多。你能提供一个例子吗?一个普通的连接模型有两个属于关系,它们在多对多结构中将A与B关联起来。我在这里没有看到其中一个。我没有完全理解你的关系关系应该是。通常属于对有很多,但你显然有两个在技能和工作之间有很多关系。塔德曼,这正是我的问题。我真的可以用has\u many虽然和技能和工作之间有很多对很多关系吗?如果是,怎么做?我不确定这是有道理的,但你可以在你的技能模型中添加一个属于:jobs
,然后在你的jobs
模型中添加一个属于:skills
。这似乎有点老套谢谢!我正在考虑不使用作业,而是通过调用技能为员工找到工作……想法?你能解释一下吗HasyMule:有资格的工人?我想从工人到工作,反之亦然,所以这是正确的。我想这是一个掩饰我的实际类名的例子,所以对于这个例子,也请考虑到工人的技能是1:很多不多:很多。谢谢!!rs.我本可以将名称更改为“工人”
,但我认为这会使您的模型不那么明显。您不能直接从一个工作转到另一个工人,您的要求规定了中间标准。在方法前面加上一些描述性的内容会使其更明显。要进行反向查询,您需要在“工人”。就我个人而言,我尽量避免这些长链。这通常意味着我的对象模型可以改进…我感觉可能是这样的,并减少了模型。您的输入非常周到,非常准确。谢谢!!
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
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