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 deid
.
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 ).