别名表名称便于3列连接表(MySQL或PostgreSQL)

时间:2009-09-15 14:56:47

标签: ruby-on-rails database join

这是一个单独的问题,但它与之前的问题有关:Three Column Join in Rails with Active Scaffold。总结一下:Rails会自动查找两列连接表,但对于三列连接表则不会这样做。我已经尝试了上一个问题中的建议,但它归结为:

如果你有模型Project,Employee,Role,并且每个模型都与其他两个有关系,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

重复Project,角色跟随

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 个答案:

答案 0 :(得分:6)

我假设你有这样的东西加入你的模型:

  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