如果使用连接表,关系必须是HABTM吗?

时间:2011-01-26 10:05:41

标签: ruby-on-rails join relationship has-and-belongs-to-many

我在Rails 2.x中有Worker,Manager和Title模型。还有一个JOIN表只有worker_id,manager_id和title_id(没有明确的模型)。由于这个JOIN表(并没有它的模型),我假设我必须有以下内容:

在工人模型中,我有:

Worker
has_and_belongs_to_many :managers
has_and_belongs_to_many :titles

但是,实际上,关系是工人只能有1个经理,但有很多标题。此外,许多工人拥有相同的经理。

一些示例数据来说明这种关系:

Worker | Title | Manager
Tom    | A     | M1
Tom    | B     | M1
Bob    | A     | M2
Pam    | C     | M1

上述工人模型是否“正确”?在创建新工人(及其所有关系)时,我会这样做:

worker = Worker.new("A")
title = "B"
manager = "C"
worker.titles << title
worker.managers << manager
worker.save

当我这样做时,我在我的数据库中得到以下内容:

Worker | Title | Manager
A      | B     | null
A      | null  | C

我想得到:

Worker | Title | Manager
A      | B     | C

1 个答案:

答案 0 :(得分:0)

你可以移动manager_id(因为,一个Worker只能在Manager上),并且拥有这样的关系

class Manager < AR::Base
  has_many :workers
end

然后,在工人所属的经理。

class Worker < AR::Base
  belongs_to :manager
end

你需要有一个连接表,比如“workers_titles”,用于保存工人和职称之间的关系

create_table "workers_titles", :id => false do |t|
  t.column "worker_id", :integer, :null => false
  t.column "title_id",  :integer, :null => false
end

型号:

class Worker < AR::Base
  has_and_belongs_to_many :titles
end

class Title < AR::Base
  has_and_belongs_to_many :workers
end