0

我正在运行 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 )

我怎样才能得到这个工作?

HBTM 上的Rails 文档说:

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

这是什么意思?

4

1 回答 1

7

您还需要在 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"

文档中的警告意味着,如果您对 Part 模型使用“parts”以外的表名,而对 StandardWidget 模型使用“standard_widgets”以外的表名,则需要在 habtm 调用下调用“set_table_name”。

于 2010-12-08T20:23:21.157 回答