2009-09-15 8 views
3

Ceci est une question distincte, mais elle est liée à une question antérieure: Three Column Join in Rails with Active Scaffold. Pour résumer: Rails recherche automatiquement une table de jointure à deux colonnes, mais elle ne fait pas la même chose pour une table de jointure à trois colonnes. J'ai essayé les suggestions dans la question précédente, mais il se résume à ceci:Nom de table Alias ​​pour faciliter la table de jointure à 3 colonnes (MySQL ou PostgreSQL)

Si vous avez les modèles Projet, employé, rôle et chacun a une relation habtm aux deux autres, les rails feront chaque relation séparément, mais pas dans son ensemble.

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 

répété pour le projet, le rôle suit

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 

Ma question est, puisque les rails semble pour employees_projects, projects_roles et employees_roles mais pas employees_projects_roles est-il un moyen d'un alias ces noms au nom de la table réelle et permet toujours la fonctionnalité CRUD dans la base de données (MySQL ou PostgreSQL)?

[Éditer] Oups. Je dois arrêter de répondre et d'interroger publiquement avant d'avoir assez de café. Changé la partie commentée de hmt à habtm. Inclus a commenté une partie du code pour refléter les différentes options que j'ai essayées.

Répondre

6

Je suppose que vous avez quelque chose comme ça se joindre à vos modèles ensemble:

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 

Si oui, vous, avez simplement besoin de spécifier le nom de la table de jointure à utiliser avec votre 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 
+0

Oui, la table de joint existait, mais je ne connaissais pas l'attribut: join_table! Même avec Google googling les deux dernières semaines. Merci de votre aide! –

Questions connexes