ruby-on-rails - software - ruby on rails tutorial
Cambiar el nombre de la mesa en rieles (4)
Quiero cambiar el nombre de una tabla ... (cualquier tabla)
Intenté esta línea de código:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Aquí está lo extraño. Sé que lo hice funcionar la primera vez, pero ahora me sale este error: método indefinido `rename_table ''para ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module
¿Hay algo que deba establecer?
Por lo general, harías este tipo de cosas en una migración:
class RenameFoo < ActiveRecord::Migration
def self.up
rename_table :foo, :bar
end
def self.down
rename_table :bar, :foo
end
end
Recuerde que en Rails> = 3.1 puede usar el método de change
.
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
rename_table :old_named_things, :new_named_things
end
end
.rename_table
es un método de instancia, no un método de clase, por lo que llamar a Class.method
no va a funcionar. En su lugar, deberá crear una instancia de la clase y llamar al método en la instancia, así: Class.new.method
.
[EDIT] En esta instancia, ActiveRecord::ConnectionAdapters::SchemaStatements
ni siquiera es una clase (como lo señala la cámara), lo que significa que ni siquiera puede crear una instancia de la misma según lo que dije anteriormente. E incluso si usaste el ejemplo de cámara de la class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
, aún no funcionaría ya que rename_table
genera una excepción.
Por otro lado, ActiveRecord::ConnectionAdapters::MysqlAdapter
es una clase, y es probable que esta clase tenga que usar para cambiar el nombre de su tabla (o SQLite o PostgreSQL, dependiendo de la base de datos que esté usando). Ahora, como sucede, ActiveRecord::ConnectionAdapters::MysqlAdapter
ya se puede acceder a través de Model.connection
, por lo que debe poder hacer Model.connection.rename_table
, utilizando cualquier modelo de su aplicación. [/EDITAR]
Sin embargo, si deseas renombrar permanentemente una tabla, te sugiero usar una migración para hacerlo. Es fácil y la forma preferida de manipular la estructura de su base de datos con Rails. He aquí cómo hacerlo:
# Commandline
rails generate migration rename_my_table
# In db/migrate/[timestamp]_rename_my_table.rb:
class RenameMyTable < ActiveRecord::Migration
def self.up
rename_table :my_table, :my_new_table
end
def self.down
rename_table :my_new_table, :my_table
end
end
Luego, puede ejecutar su migración con rake db:migrate
self.up
(que llama al método self.up
) y usar rake db:rollback
(que llama a self.down
) para deshacer la migración.
ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)