59

この質問は、レール結合テーブルを作成した後にフォームをリンクする方法に由来します

製品モデルとカテゴリ モデルの間に結合テーブルを作成しています。

結合テーブルの名前は何ですか? category_products または category_products または何か他のもの?

4

4 に答える 4

76

categories_products. どちらも複数形。字句順。

見積もり:

:join_table オプションを使用して結合テーブルの名前を明示的に指定しない限り、Active Record はクラス名の字句順序を使用して名前を作成します。したがって、顧客モデルと注文モデルの間の結合では、デフォルトの結合テーブル名「customers_orders」が付けられます。字句順序では「c」が「o」よりもランクが高いためです。

于 2012-07-21T08:16:12.180 に答える
54

レール4

Rails 4からいくつかの新しいルールがあることに注意してください。

別のクラスとの多対多の関係を指定します。これにより、中間結合テーブルを介して 2 つのクラスが関連付けられます。結合テーブルがオプションとして明示的に指定されていない限り、クラス名の字句順序を使用して推測されます。したがって、Developer と Project の間の結合では、デフォルトの結合テーブル名が「developers_projects」になります。これは、「D」がアルファベット順で「P」に先行するためです。

この優先順位は、文字列の < 演算子を使用して計算されることに注意してください。これは、文字列の長さが異なり、最短の長さまで比較したときに文字列が等しい場合、長い文字列は短い文字列よりも語彙の優先順位が高いと見なされることを意味します。たとえば、テーブル「paper_boxes」と「papers」では、「paper_boxes」という名前の長さから「papers_paper_boxes」という結合テーブル名が生成されると予想されますが、実際には「paper_boxes_papers」という結合テーブル名が生成されます。この警告に注意し、必要に応じてカスタム :join_table オプションを使用してください。

テーブルが共通のプレフィックスを共有している場合、最初に 1 回だけ表示されます。たとえば、テーブル「catalog_categories」と「catalog_products」は「catalog_categories_products」という結合テーブル名を生成します。

=> 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 

レール5

ルールは今でもほとんど同じです。Rails 5では、マイグレーションで結合テーブルを作成するための新しいヘルパーがあります。

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

=> Rails の Edge ドキュメント

于 2014-04-15T12:52:10.973 に答える
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 テーブルと User テーブルの間に結合テーブルを作成する

BlogPost-User

blog_posts_users      # In alphabetical order with plural names
于 2015-06-04T06:03:21.717 に答える