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?
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.
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
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
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
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.