remove rails migrations generate foreign ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 rails-migrations

ruby on rails - rails - Convención de nombres de rieles para unirse a la mesa



remove migration rails (4)

Esta pregunta se deriva de: Cómo vincular el formulario después de crear los carriles unirse a la mesa

Estoy creando la tabla de unión entre mis Modelos de Producto y Categoría.

¿Qué nombre debe tener la tabla de unión? categories_products o category_products o algo mas?


Carriles 4

Preste atención que desde Rails 4 hay algunas reglas nuevas.

Especifica una relación muchos a muchos con otra clase. Esto asocia dos clases a través de una tabla de combinación intermedia. A menos que la tabla de unión se especifique explícitamente como una opción, se adivina utilizando el orden léxico de los nombres de clase. Entonces, una unión entre Desarrollador y Proyecto dará el nombre de la tabla de combinación predeterminada de "developers_projects" porque "D" precede alfabéticamente a "P".

Tenga en cuenta que esta precedencia se calcula utilizando el operador <para String. Esto significa que si las cadenas son de diferentes longitudes y las cadenas son iguales cuando se comparan hasta la longitud más corta, entonces la cadena más larga se considera de mayor precedencia léxica que la más corta. Por ejemplo, uno esperaría que las tablas "paper_boxes" y "papers" generaran un nombre de tabla de unión de "papers_paper_boxes" debido a la longitud del nombre "paper_boxes", pero de hecho genera un nombre de tabla de combinación de "paper_boxes_papers". Tenga en cuenta esta advertencia y use la opción personalizada: join_table si lo necesita.

Si sus tablas comparten un prefijo común, solo aparecerá una vez al principio. Por ejemplo, las tablas "catalog_categories" y "catalog_products" generan un nombre de tabla de combinación de "catalog_categories_products".

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

Carriles 5

La regla sigue siendo bastante igual. Con Rails 5 tenemos un nuevo ayudante para crear tablas de combinación con migraciones:

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

=> Edge docs for Rails


La nueva migración create_join_table crea una tabla de unión que no tiene el modelo correspondiente, por lo que no se requiere convención de nomenclatura para el nombre del modelo.

Para acceder a la unión, debe declarar has_and_belongs_to_many en las dos tablas y acceder a ellas a través de la asociación creada.


Unir tablas en Rails debe crearse en orden alfabético solamente. Mantenga este punto en mente cada vez que cree una tabla de unión.

Por ejemplo, si desea crear una tabla de unión entre la tabla de proyecto y la tabla de colaborador, debe nombrarla como se muestra a continuación.

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

Ejemplo: Crear una tabla de unión entre Project y Collaborator

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

Ejemplo 2: Crear tabla de unión entre la tabla BlogPost y la tabla de usuario

BlogPost-User blog_posts_users # In alphabetical order with plural names


categories_products . Ambos plural. En orden léxico

Quote :

A menos que el nombre de la tabla de unión se especifique explícitamente mediante la opción: join_table, Active Record crea el nombre utilizando el orden léxico de los nombres de clase. Por lo tanto, una combinación entre los modelos de cliente y pedido dará el nombre de la tabla de combinación predeterminada de "clientes_ordenadores" porque "c" está por encima de "o" en el orden léxico.