Rails为连接表命名约定

Yog*_*zzz 50 ruby-on-rails rails-migrations ruby-on-rails-3 ruby-on-rails-3.1

这个问题源于:如何在创建rails join表之后链接表单

我正在创建产品和类别模型之间的连接表.

连接表应该命名为什么?categories_products或category_products或其他什么?

Zab*_*bba 59

categories_products.都是复数.在词汇顺序.

Quote:

除非使用:join_table选项显式指定连接表的名称,否则Active Record将使用类名的词法顺序创建名称.因此,客户和订单模型之间的连接将提供默认的连接表名称"customers_orders",因为"c"在词法排序中超出"o".

  • 为什么ActiveRecord模型`CategoryProduct`不会自动获取此表?它似乎在寻找`category_products`.我必须指定`self.table_name ="categories_products"` (5认同)
  • 名为`CategoryProduct`的模型与rails计算多少个连接表名称不同.问题是关于连接表,而不是名为CategoryProduct的模型. (2认同)
  • 如果没有其他人不熟悉“词序”一词,快速搜索就会告诉我,这基本上是说“字母序”的一种奇特方式。 (2认同)

dam*_*ser 46

Rails 4

注意从Rails 4中有一些新的规则.

指定与另一个类的多对多关系.这通过中间连接表关联两个类.除非将连接表明确指定为选项,否则使用类名的词法顺序进行猜测.因此,Developer和Project之间的连接将提供默认连接表名称"developers_projects",因为"D"按字母顺序排在"P"之前.

请注意,此优先级使用<operator for String计算.这意味着如果字符串具有不同的长度,并且在比较最短长度时字符串相等,则较长字符串被认为具有比较短字符串更高的词汇优先级.例如,由于名称"paper_boxes"的长度,人们会期望表"paper_boxes"和"papers"生成连接表名称"papers_paper_boxes",但实际上它生成连接表名称"paper_boxes_papers".请注意这一警告,如果需要,请使用custom:join_table选项.

如果您的表共享一个公共前缀,它只会在开头出现一次.例如,表"catalog_categories"和"catalog_products"生成连接表名称"catalog_categories_products".

=> Docs for Rails v4.2.7

# alphabetically order
developers + projects                 -->  developers_projects 

# precedence is calculated with '<', lengthier strings have precedence 
# if the string are equal compared to the shortest length
paper_boxes + papers                  -->  paper_boxes_papers  

# common prefix omitted
catalog_categories + catalog_products -->  catalog_categories_products 
Run Code Online (Sandbox Code Playgroud)

Rails 5

规则仍然相同.使用Rails 5,我们有一个新的帮助器,用于创建具有迁移的连接表:

class CreateDevelopersProjectsJoinTable < ActiveRecord::Migration[5.0]
  def change
    create_join_table :developers, :projects
  end
end
Run Code Online (Sandbox Code Playgroud)

=> Rails的边缘文档

  • @DickieBoy - 连接表名称总是两个复数(因此您的示例与默认约定不匹配).文档是指个别车型如`Project`(奇异,表名这将是`projects`)和像`papers`单独的表(复数,该模型将是`Paper`) - 无论是正确的,只是从不同的上下文. (2认同)