update rails migrations generate column active ruby-on-rails activerecord jointable

ruby on rails - rails - ¿Cuál es el comportamiento de create_join_table de ActiveRecord:: Migration?



ruby rails active record (3)

Descubrí una buena forma de generar tablas de combinación para mis relaciones HABTM en mi aplicación Rails.

rails g migration CreateJoinTable table1 table2

Esto genera una ActiveRecord::Migration que emplea el método create_join_table

Me pregunto qué hace este maravilloso método misterioso. Supongo que crea una tabla (probablemente sin un campo de id ) que tiene una columna para la clave foránea de la tabla 1 y una columna para la clave foránea de la tabla 2, pero ¿la tabla tiene alguna otra característica? Mi costumbre para unir tablas siempre ha sido agregar un índice único en ambas columnas para que no se pueda ingresar dos veces una relación entre un registro en la tabla1 y un registro en la tabla2.

Mi pregunta se reduce a: si uso create_join_table ¿debo seguir agregando ese índice único, o este método lo hace por mí (creo que debería)?

La documentación que generalmente miro no entra en este tipo de detalles.


Resulta que no hace más de lo básico que describí en la pregunta. Descubrí esto simplemente ejecutando la migración y viendo lo que termina en db/schema.rb

Para aquellos interesados, para obtener el índice único, hagan esto:

class CreateJoinTable < ActiveRecord::Migration def change create_join_table :posts, :users add_index :posts_users, [:post_id, :user_id], unique: true, name: ''index_posts_users'' end end


SchemaStatements # create_join_table () solo crea una tabla de unión sin ningún tipo de índices extravagantes, etc. ... Por lo tanto, si desea usar la restricción de exclusividad en dos campos, debe hacer algo como esto:

class CreateJoinTable < ActiveRecord::Migration def change create_join_table :posts, :users do |t| t.integer :post_id, index: true t.integer :user_id, index: true t.index [:post_id, :user_id], name: ''post_user_un'', unique: true end end end

Tenga en cuenta también que create_join_table por defecto NO crea el campo de id .


Llamado sin ningún bloque, create_join_table solo crea una tabla con dos claves externas que hacen referencia a las dos tablas unidas.

Sin embargo, puede pasar un bloque cuando llame al método para realizar operaciones adicionales (por ejemplo, agregar índices). Del documento Rails:

create_join_table :products, :categories do |t| t.index :product_id t.index :category_id end

Eche un vistazo a la documentación de create_join_table .

Puede verificar el código create_join_table en la parte inferior (haga clic en Source: show ).