Если используется таблица соединения, должны ли отношения быть HABTM? - PullRequest
0 голосов
/ 26 января 2011

У меня есть модели Worker, Manager и Title в Rails 2.x.Существует также таблица JOIN, в которой есть только worker_id, manager_id и title_id (для этого нет явной модели).Из-за этой таблицы JOIN (и не имеющей для нее модели), я предполагаю, что у меня должно быть следующее:

В модели Worker у меня есть:

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 голосов
/ 26 января 2011

Вы можете переместить manager_id (поскольку работник может иметь только на Manager) и иметь отношения, подобные этим

class Manager < AR::Base
  has_many :workers
end

Затем в Worker принадлежит_ к менеджеру.

class Worker < AR::Base
  belongs_to :manager
end

Вам нужна таблица соединения, например, "worker_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
...