HABTM的命名约定问题

时间:2016-07-01 04:13:51

标签: ruby-on-rails activerecord

我在HABTM关系中有两个模型:MaintenanceOrderMaintenance。迁移声明如下

create_table :maintenance_orders do |t|
  ...
end
create_table :maintenances do |t|
  ...
end

关于创建连接表,我注意到如果我有:

create_table :maintenances_maintenance_orders, id: false do |t|
  t.belongs_to :maintenance, index: true
  t.belongs_to :maintenance_order, index: true
end

然后我会收到错误:

I have two models that are similar, and I'm wondering if this is the cause of the error?

@maintenance.maintenances
=> ActiveRecord::StatementInvalid: Could not find table 'maintenance_orders_maintenances'
@maintenance_order.maintenances
=> ActiveRecord::StatementInvalid: Could not find table 'maintenance_orders_maintenances'

然而,如果我有,因为错误表明这样的连接表:

create_table :maintenance_orders_maintenances, id: false do |t|
  t.belongs_to :maintenance_order, index: true
  t.belongs_to :maintenance, index: true
end

一切正常。但我问这个问题是因为据我所知,根据HABTM的定义,模型的声明顺序无关紧要。所以...这只是因为名字是如此相似而且我需要以这种方式做一个蛇案例(就像可能让maintenances_maintenance过分混淆)或者......?关于这个的任何规则?

1 个答案:

答案 0 :(得分:1)

默认情况下,Rails在连接表名称中按字母顺序排序表名。 maintenance_order出现在maintenances之前,因此:maintenance_orders_maintenances是rails希望命名表的内容。有关详细信息,请参阅http://edgeguides.rubyonrails.org/active_record_migrations.html#creating-a-join-table

如果您偏离Rails的期望,您可以自己配置表名,但最好遵循标准命名程序。

请注意,阅读所有Rails指南非常值得您花时间阅读 - 这样就可以很好地提升您的导航知识。