web-dev-qa-db-fra.com

Rails convention de dénomination pour la table de jointure

Cette question provient de: Comment lier un formulaire après avoir créé Rails join table

Je crée la table de jointure entre mes modèles de produit et de catégorie.

Comment nommer la table de jointure? categories_products ou category_products ou autre chose?

50
Yogzzz

categories_products. Les deux au pluriel. Dans l'ordre lexical.

Citation :

Sauf si le nom de la table de jointure est explicitement spécifié à l'aide de l'option: join_table, Active Record crée le nom en utilisant l'ordre lexical des noms de classe. Ainsi, une jointure entre le client et les modèles de commande donnera le nom de table de jointure par défaut "clients_ordres" car "c" devance "o" dans l'ordre lexical.

58
Zabba

Rails 4

Faites attention à ce que Rails 4 il y ait de nouvelles règles.

Spécifie une relation plusieurs-à-plusieurs avec une autre classe. Cela associe deux classes via une table de jointure intermédiaire. À moins que la table de jointure ne soit explicitement spécifiée comme option, elle est supposée utiliser l'ordre lexical des noms de classe. Ainsi, une jointure entre Developer et Project donnera le nom de table de jointure par défaut de "developers_projects" car "D" précède alphabétiquement "P".

Notez que cette priorité est calculée à l'aide de l'opérateur <pour String. Cela signifie que si les chaînes sont de longueurs différentes et que les chaînes sont égales par rapport à la longueur la plus courte, alors la chaîne la plus longue est considérée comme ayant une priorité lexicale plus élevée que la plus courte. Par exemple, on pourrait s'attendre à ce que les tables "paper_boxes" et "papers" génèrent un nom de table de jointure de "papers_paper_boxes" en raison de la longueur du nom "paper_boxes", mais cela génère en fait un nom de table de jointure de "paper_boxes_papers". Soyez conscient de cette mise en garde et utilisez l'option custom: join_table si vous en avez besoin.

Si vos tables partagent un préfixe commun, il n'apparaîtra qu'une seule fois au début. Par exemple, les tables "catalog_categories" et "catalog_products" génèrent un nom de table de jointure "catalog_categories_products".

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

La règle est toujours la même. Avec Rails 5 nous avons un nouvel assistant pour créer des tables de jointure avec des migrations:

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

=> Edge docs pour Rails

44
damoiser

Rejoignez les tables en Rails doit être créé dans l'ordre alphabétique uniquement. Gardez ce point à l'esprit chaque fois que vous créez une table de jointure.

Par exemple, si vous souhaitez créer une table de jointure entre la table de projet et la table des collaborateurs, vous devez la nommer comme ci-dessous.

Syntaxe: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

Exemple: Création d'une table de jointure entre le projet et le collaborateur

Collaborator-Project

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

Exemple 2: Création d'une table de jointure entre la table BlogPost et la table utilisateur

BlogPost-User

blog_posts_users      # In alphabetical order with plural names
2
Prabhakar

La nouvelle migration create_join_table crée une table de jointure qui n'a pas de modèle correspondant, donc aucune convention de dénomination n'est requise pour le nom du modèle.

Pour accéder à la jointure, vous devez déclarer has_and_belongs_to_many sur les deux tables et y accéder via l'association créée.

1
Taylored Web Sites