Rails HBTM join_table覆盖table_name

ma1*_*w28 0 ruby-on-rails associations has-and-belongs-to-many tablename jointable

我正在运行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
Run Code Online (Sandbox Code Playgroud)

并得到错误

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 )
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这个工作?

关于HBTMRails文档说:

警告:如果要覆盖任一类的表名,则必须在任何has_and_belongs_to_many声明下声明table_name方法才能工作.

这是什么意思?

Mik*_*ski 5

您还需要在has_and_belongs_to_many调用中使用:foreign_key.所以在StandardWidget模型中你需要这个:

  has_and_belongs_to_many :parts, :join_table => "widgets_parts", :association_foreign_key => "widget_custom_id", :foreign_key => "part_custom_id"
Run Code Online (Sandbox Code Playgroud)

文档中的警告意味着如果您使用Part部件模型的"部件"以外的表名和StandardWidget模型的"standard_widgets",则需要在habtm调用下调用"set_table_name".