ruby on rails - references - has_many, belongs_to relation en los carriles activos de migración de registros 4




relationship rails 5 (4)

Creé un modelo de User y luego un modelo de Task . No he mencionado ninguna relación entre ellos durante la creación.

Entiendo que el User has_many Tasks y una Task belongs_to User . Necesito establecer esta relación entre ellos a través de la migración.

Mi pregunta es, ¿cuál sería el comando de generación de migración para establecer esa relación?

Cualquier ayuda sería muy apreciada.


Cómo debe hacerse al crear la migración en primer lugar:

rails g scaffold child parent:references

Qué hacer si olvidó el parent:references bit de parent:references :

Si realmente no tiene mucho definido en el modelo / db sobre el niño. Su mejor opción podría ser ejecutar rails destroy scaffold child , y luego ejecutar rails g scaffold child parent:references sobre él. Asegúrese de agregar la línea drop_table :children if table_exists? :children drop_table :children if table_exists? :children antes de crear la tabla en el archivo que crea la nueva tabla. (De esta forma, si alguien extrae su código, puede ejecutar las migraciones y finalizar). Sin embargo, parece más probable que tenga datos que ya no desea perder en el modelo hijo.

En ese caso:

rails g migration add_parent_refs_to_child

## XXXXXXXXXXXXXX_add_parent_refs_to_child.rb
class AddParentRefsToChild < ActiveRecord::Migration
  def change
    add_reference :child, :parent, index: true
  end
end

Ver add_reference para más detalles.

Además, no se olvide de asegurarse de que el modelo principal has_[one | many] :children has_[one | many] :children , y que el modelo hijo belongs_to :parent .

Cómo no hacerlo:

Puede sentirse tentado de entrar y agregar el parent_id de forma manual, y ciertamente podría, esta no es la mejor solución, ya que no es la manera convencional de agregar claves externas, y no se presta muy bien para la facilidad de mantenimiento o legibilidad. . ¡Convención sobre configuración!

La guía de asociación de Ruby on Rails también tiene más información útil sobre el tema.


La migración agregará la identificación del usuario a la tabla de tareas para que se conozcan entre sí

rails g migration AddUserIdToTask user_id:integer

entonces

rake db:migrate

Y después de actualizar sus controladores y vistas para que las tareas no se puedan crear por sí mismas sino que se correspondan con un usuario


Para responder a la pregunta, "¿Cuál sería el comando de generación de migración para establecer esa relación?" (Es decir, cómo se agrega una migración para los modelos existentes con una relación como User has_many Tasks & Task belongs_to User )

La manera más fácil de recordar es así:

>rails g migration AddUserToTask user:belongs_to

o

>rails g migration AddUserToTask user:references

:belongs_to es solo un alias de :references , por lo que cualquiera hará lo mismo.

Al hacerlo de esta manera, el comando inferirá el nombre de la tabla del nombre de la migración, configurará un método de cambio que agregará la columna para la relación y lo configurará para su indexación:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end

Después de generar eso:

>rake db:migrate

Finalmente, aún debe agregar las relaciones habituales a sus modelos, como se establece en las otras respuestas, pero creo que esta es la respuesta correcta a su pregunta.


Podrías llamar:

rails g model task user:references

que generará una columna user_id en la tabla de tasks y modificará el modelo task.rb para agregar un belongs_to :user . Tenga en cuenta que debe colocar manualmente la relación has_many :tasks o has_one :task en el modelo user.rb

Si ya tiene el modelo generado, puede crear una migración con lo siguiente:

rails g migration AddUserToTask user:belongs_to

que generará:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end

la única diferencia con este enfoque es que la relación belongs_to :user en el modelo task.rb no se creará automáticamente, por lo que debe crearla por su cuenta.





rails-migrations