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