0

我正在尝试实施这个项目:

http://img7.imagebanana.com/img/cnb46ti2/relationships.png

  • 我想让在员工的显示页面上查看员工的技能
  • 一个员工有一个职位,每个职位都有这个职位的员工需要知道的技能
  • 因此,如果我理解正确,职位和技能具有 n:m 关系,并且他们需要一个连接表来建立 has_many_and_belongs_to_many 关系。因为一个职位包含很多技能,每个技能都属于很多职位。

现在我的问题

  1. position_skill-table -> 使用 has_and_belongs_to_many 关系更好,所以这个表没有自己的 id 还是使用 has_many :through 关系更好?我想最好使用 has_and_belongs_to_many 关系,因为这个关系表里面除了两个键之外没有任何进一步的信息。我对吗?
  2. 如果我采用 has_and_belongs_to_many - 关系,那是我唯一需要写入模型的东西吗?

一种)class Position < ActiveRecord :: Base (...) has_and_belongs_to_many :skills (...)

b)class Skill < ActiveRecord :: Base (...) has_and_belongs_to_many :positions (...)

c) 进入 db\migratedef self.up create_table :positon_skill, :id => false do |t| (...) 之后,职位和技能是相互关联的吗?是对的吗?我是不是忘记了什么?

  • 如果是这样,我怎样才能在员工的显示页面上查看技能?一个员工有1个职位,这个职位有几个技能......我需要在员工的show.html.erb中写入什么代码?像<%= employee.position.skill %>什么?我还需要渲染一些东西吗?对不起,我很困惑,我认为我在网上阅读了太多信息......或者网上有什么描述可以准确描述我需要什么?

提前非常感谢,很抱歉这个多余的问题。

4

2 回答 2

0

这就是它在您的图表中的样子。考虑以下:

class Employee < ActiveRecord :: Base
  belongs_to :position
  ...
end

class Position < ActiveRecord :: Base
  has_many :employees
  has_many :position_skills
  has_many :skills, :through => :position_skills
  ...
end    

class PositionSkill < ActiveRecord :: Base
  belongs_to :position
  belongs_to :skill
  ...
end

class Skill < ActiveRecord :: Base
  has_many :position_skills
  has_many :positions, :through => :position_skills
  ...
end

唯一的问题是员工被绑定到一个职位。而这个职位通过职位有很多技能。我会将其更改为定位belongs_to员工和员工has_many职位。这使得它可以跟踪从一个职位转移到下一个职位的员工。如果您需要更多信息,请告诉我。

于 2011-06-17T19:11:01.803 回答
0
  1. 如果您确定以后不想在position_skills表格中添加任何信息,has_and_belongs_to_many则可以正常工作。但是,has_many :through如果您稍后改变主意并且设置起来并不难,它会更加灵活。

  2. 如果使用,则只需要在模型和数据库表中使用和字段has_and_belongs_to_many进行关联声明。好像你已经有了。position_id:integerskill_id:integer

为了能够employee.position.skills在您的视图中访问,您需要急切地加载员工的关联。尝试以下操作:

class EmployeesController < ApplicationController
  ...
  def show
    @employee = Employee.find(params[:id], :include => { :position => :skills })
  end
  ...
end

我认为如果您坚持使用 应该可以has_and_belongs_to_many,但是如果您选择has_many :through(我推荐),则需要使用:include => { :position => { :position_skills => :skills } }

于 2011-06-17T19:17:36.783 回答