用下划线命名的模型之间的 HABTM 关联

HABTM association between models named with underscore

我遇到了以下问题: 我的 Rails 应用程序有很多模型,但我对其中两个模型之间的关联有疑问:

class RedArticle < ActiveRecord::Base
  has_and_belongs_to_many :red_sections
end

class RedSection < ActiveRecord::Base
  has_and_belongs_to_many :red_articles
end

似乎是标准设置。但是当我用

测试关联时
RedArticle.first.red_sections

然后我得到以下错误:

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'clubago.red_articles_sections' doesn't exist: SHOW FULL FIELDS FROM red_articles_sections

所以我的 Rails 查找名为 red_articles_sections 的 table 而不是 red_articles_red_sections(它存在于我的数据库中)。有人知道这个问题来自哪里吗?我尝试将数据库重命名为 red_articles_sections 并且成功了,但我认为这不是一个好的解决方案。

这会有帮助吗

class RedArticle < ActiveRecord::Base
 has_and_belongs_to_many :red_sections, join_table: "red_articles_red_sections"
end


class RedSection < ActiveRecord::Base
  has_and_belongs_to_many :red_articles, join_table: "red_articles_red_sections"
end

参考:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many(选项)

实际上,这是故意的。 Rails docs 解释一下:

If your tables share a common prefix, it will only appear once at the beginning. For example, the tables “catalog_categories” and “catalog_products” generate a join table name of “catalog_categories_products”.

所以,您的快速修复是正确的。但是,我个人的建议是从您的两个模型中删除 Red 前缀——除非您的架构中某处有一个名为 Article 的不同模型,否则 Red 真的会添加任何东西吗?

也可以,如果您想保留旧的连接 table 名称。