tutorial software rails ejemplos descargar curso caracteristicas ruby-on-rails

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)