0

Je suis à court Rails 2.3.2 et faire:Rails HBTM join_table overwirting nom_table

class StandardWidget < ActiveRecord::Base 
    has_and_belongs_to_many :parts, :join_table => "widgets_parts", :association_foreign_key => "widget_custom_id" 
end 

class Part < ActiveRecord::Base 
    has_and_belongs_to_many :widgets, :join_table => "widgets_parts", :association_foreign_key => "part_custom_id" 
end 

p = StandardWidget.find(5) 
p.widgets 

et obtenir l'erreur

ActiveRecord::StatementInvalid: Mysql::Error: Unknown column 'widgets_parts.standard_widget_id' in 'where clause': SELECT * FROM `widgets` INNER JOIN `widgets_parts` ON `parts`.part_custom_id = `widgets_parts`.part_custom_id WHERE (`widgets_parts`.standard_widget_id = 5) 

Comment puis-je obtenir ce travail?

Le Rails documentation on HBTM dit:

AVERTISSEMENT: Si vous écrasez le nom de la table soit classe, la méthode nom_table DOIT être déclaré sous toute déclaration has_and_belongs_to_many afin de travailler.

Qu'est-ce que cela signifie?

Répondre

5

Vous devez utiliser: foreign_key également dans l'appel has_and_belongs_to_many. Ainsi, dans le modèle StandardWidget vous en avez besoin:

has_and_belongs_to_many :parts, :join_table => "widgets_parts", :association_foreign_key => "widget_custom_id", :foreign_key => "part_custom_id" 

L'avertissement dans les docs signifie que si vous utilisez des noms de table autres que des « parties » pour le modèle partiel et « standard_widgets » pour le modèle StandardWidget, alors vous avez besoin appeler 'set_table_name' sous l'appel habtm.

+0

A travaillé! Merci! – ma11hew28