ruby-on-rails hacer - Rails 3 migraciones:¿Agregar columna de referencia?




regresar deshacer (9)

Al agregar una columna, debe hacer que esa columna sea un número entero y, si es posible, seguir las convenciones de los rieles. Entonces, para su caso, supongo que ya tiene un Tester y modelos de usuario, y tablas de probadores y usuarios.

Para agregar la clave externa, necesita crear una columna entera con el nombre user_id (convención):

add_column :tester, :user_id, :integer

A continuación, agregue un belongs_to al modelo del probador:

class Tester < ActiveRecord::Base
  belongs_to :user
end

Y es posible que también desee agregar un índice para la clave externa (esto es algo que las referencias ya le hacen):

add_index :tester, :user_id

Si creo una nueva migración de rieles 3 con (por ejemplo)

rails g migration tester title:tester user:references

, todo funciona bien ... sin embargo, si agrego una columna con algo como:

rails g migration add_user_to_tester user:references

el campo de referencia no es reconocido. En resumen, la pregunta es: ¿cómo agrego una columna de referencia a una migración de rieles desde la línea de comando?


Con los dos pasos anteriores indicados anteriormente, aún no aparece la restricción de clave externa. Esto debería funcionar:

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end

Eso hará el truco:

rails g migration add_user_to_tester user_id:integer:index

Si está utilizando Rails 4.x ahora puede generar migraciones con referencias, como esta:

rails generate migration AddUserRefToProducts user:references

como se puede ver en las guías de rieles


Puede agregar referencias a su modelo a través de la línea de comando de la siguiente manera:

rails g migration add_column_to_tester user_id:integer

Esto generará un archivo de migración como:

class AddColumnToTesters < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
  end
end

Esto funciona bien cada vez que lo uso ..


Para Rails 4

El generador acepta el tipo de columna como referencias (también disponible como belongs_to ).

Esta migración creará una columna user_id y un índice apropiado:

$ rails g migration AddUserRefToProducts user:references 

genera:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true
  end
end

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

Para Rails 3

Helper se llama referencias (también disponible como belongs_to ).

Esta migración creará una columna category_id del tipo apropiado. Tenga en cuenta que pasa el nombre del modelo, no el nombre de la columna. Active Record agrega _id para usted.

change_table :products do |t|
  t.references :category
end

Si tiene asociaciones belongs_to asociaciones polimórficas, entonces las referencias agregarán las dos columnas requeridas:

change_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

Agregará una columna attachment_id y una columna attachment_type column con un valor predeterminado de Photo .

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration


Running rails g migration AddUserRefToSponsors user:references generarán la siguiente migración:

def change
  add_reference :sponsors, :user, index: true
end

Tenga en cuenta que lo más probable es que también necesite un índice en esa columna.

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end

Solo genere migración usando el comando

rails g migration rename_hased_password

Después de eso edite la migración agregue la siguiente línea en el método de cambio

rename_column :table, :hased_password, :hashed_password

Esto debería funcionar.





ruby-on-rails activerecord migration