web-dev-qa-db-ja.com

Rails結合テーブルの命名規則

この質問は以下から生じます。 作成後のフォームのリンク方法Railsテーブルの結合

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

結合テーブルの名前は何にする必要がありますか? category_productsまたはcategory_productsまたは他の何か?

50
Yogzzz

categories_products。両方とも複数。字句順。

引用

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

58
Zabba

Rails 4

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

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

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

テーブルが共通のプレフィックスを共有している場合、先頭に1回だけ表示されます。たとえば、「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

=> Railsのエッジドキュメント

44
damoiser

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
2
Prabhakar

新しいcreate_join_table移行では、対応するモデルのない結合テーブルが作成されるため、モデル名に命名規則は必要ありません。

結合にアクセスするには、2つのテーブルでhas_and_belongs_to_manyを宣言し、作成された関連付けを介してそれらにアクセスする必要があります。

1