Имя таблицы псевдонимов для облегчения объединения трех столбцов (MySQL или PostgreSQL) - PullRequest
3 голосов
/ 15 сентября 2009

Это отдельный вопрос, но он связан с более ранним вопросом: Трехстоечное соединение в Rails с Active Scaffold . Подводя итог: Rails автоматически ищет таблицу соединения из двух столбцов, но не делает то же самое для таблицы соединения из трех столбцов. Я попробовал предложения в предыдущем вопросе, но все сводится к следующему:

Если у вас есть модели Project, Employee, Role и у каждого есть отношение habtm к двум другим, rails будет выполнять каждое отношение отдельно, но не в целом.

class Employee < ActiveRecord::Base
    #has_many        :employees_projects_roles
    #has_many        :roles,     :through => :employees_projects_roles
    #has_many        :projects,  :through => :employees_projects_roles
     has_and_belongs_to_many :roles
     has_and_belongs_to_many :projects
end

повторяется для проекта, роль следует

class Role < ActiveRecord::Base
    #has_many :employees, :through => :employees_projects_roles
    #has_many :projects,  :through => :employees_projects_roles
    has_and_belongs_to_many :employees
    has_and_belongs_to_many :projects
end

У меня такой вопрос, так как rails ищет employees_projects, projects_roles, а employees_roles, но не employees_projects_roles, есть ли способ присвоить этим именам реальное имя таблицы и по-прежнему разрешать функции CRUD в базе данных (MySQL или PostgreSQL )?

[Изменить] Упс. Я должен перестать отвечать и задавать вопросы публично, пока мне не хватило кофе. Изменена закомментированная часть с hmt на habtm. Включена закомментированная часть кода, отражающая различные варианты, которые я пробовал.

1 Ответ

6 голосов
/ 15 сентября 2009

Я предполагаю, что у вас есть что-то вроде этого, объединяющее ваши модели:

  def self.up
    create_table :my_join_table, :id => false do |t|
      t.integer :employee_id
      t.integer :role_id
      t.integer :project_id
      t.timestamps
    end
  end

Если это так, вам просто нужно указать имя таблицы соединений для использования с вашим habtm.

class Employee < ActiveRecord::Base
  has_and_belongs_to_many :roles, :join_table => "my_join_table"
  has_and_belongs_to_many :projects, :join_table => "my_join_table"
end

class Project < ActiveRecord::Base
  has_and_belongs_to_many :roles, :join_table => "my_join_table"
  has_and_belongs_to_many :employees, :join_table => "my_join_table"
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :employees, :join_table => "my_join_table"
  has_and_belongs_to_many :projects, :join_table => "my_join_table"
end
...