Rails HBTM join_table перезапись table_name - PullRequest
0 голосов
/ 08 декабря 2010

Я запускаю Rails 2.3.2 и делаю:

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

и получаю ошибку

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 )

Как мне это работает?

Документация Rails по HBTM гласит:

ВНИМАНИЕ: Если вы перезаписываете имя таблицы любого из классов, метод table_name ДОЛЖЕН быть объявлен под любым объявлением has_and_belongs_to_many, чтобы работать.

Что это значит?

1 Ответ

5 голосов
/ 08 декабря 2010

Вам нужно будет использовать: foreign_key также в вызове has_and_belongs_to_many.Таким образом, в модели StandardWidget вам нужно следующее:

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

Предупреждение в документации означает, что если вы используете имена таблиц, отличные от 'parts' для модели Part и 'standard_widgets' для модели StandardWidget, товам нужно вызвать set_table_name под вызовом habtm.

...