Rails为连接表命名约定

时间:2012-07-21 07:52:58

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 rails-migrations

这些问题源于:How to link form after creating rails join table

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

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

4 个答案:

答案 0 :(得分:57)

categories_products。都是复数。按词汇顺序。

Quote

  

除非使用。明确指定了连接表的名称   :join_table选项,Active Record通过使用创建名称   类名的词法顺序。所以客户和订单之间的联系   模型将提供默认的连接表名称“customers_orders”   因为“c”在词汇排序中胜过“o”。

答案 1 :(得分:44)

Rails 4

请注意 Rails 4 有一些新规则。

  

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

     

请注意,此优先级使用<运营商   串。这意味着如果字符串具有不同的长度,并且   当比较到最短的长度时,弦是相等的   较长的字符串被认为具有较高的词汇优先级   较短的一个。例如,人们会期望表格“paper_boxes”   和“papers”生成连接表名称“papers_paper_boxes”   因为名称“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 

Rails 5

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

class CreateDevelopersProjectsJoinTable < ActiveRecord::Migration[5.0]
  def change
    create_join_table :developers, :projects
  end
end

=&GT; Edge docs for Rails

答案 2 :(得分:2)

必须按字母顺序创建Rails中的连接表。每次创建连接表时都要记住这一点。

例如,如果要在项目表和协作者表之间创建连接表,则必须将其命名为如下所示。

语法: first_table_name(UNDERSCORE)second_table_name

# Names must be in alphabetical order and also in plural
# Decide which is your first table name based on the alphabetical order

示例:在项目和协作者之间创建联接表

Collaborator-Project

collaborators_projects   
# you should name it  like this; In alphabetical order with plural names

示例2:在BlogPost表和用户表之间创建联接表

BlogPost-User

blog_posts_users      # In alphabetical order with plural names

答案 3 :(得分:1)

新的create_join_table迁移会创建一个没有相应模型的连接表,因此模型名称不需要命名约定。

要访问连接,您必须在两个表上声明has_and_belongs_to_many,并通过创建的关联访问它们。