.rename_table
jest metodą instancji, a nie metodą klasową, więc wywołanie Class.method
nie będzie działać. Zamiast tego musisz utworzyć instancję klasy i wywołać metodę na przykład tak: Class.new.method
.
[EDYTUJ] W tym przypadku ActiveRecord::ConnectionAdapters::SchemaStatements
nie jest to nawet klasa (na co wskazuje cam), co oznacza, że nie można nawet utworzyć jej instancji zgodnie z tym, co powiedziałem powyżej. Nawet jeśli użyjesz przykładu z kamery class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
, to nadal nie zadziała, ponieważ rename_table
wywołuje wyjątek.
Z drugiej strony ActiveRecord::ConnectionAdapters::MysqlAdapter
jest to klasa i prawdopodobnie ta klasa musiałabyś użyć do zmiany nazwy tabeli (lub SQLite lub PostgreSQL, w zależności od używanej bazy danych). Teraz, jak to się dzieje, ActiveRecord::ConnectionAdapters::MysqlAdapter
jest już dostępne przez Model.connection
, więc powinieneś być w stanie to zrobić Model.connection.rename_table
, używając dowolnego modelu w swojej aplikacji. [/EDYTOWAĆ]
Jeśli jednak chcesz trwale zmienić nazwę tabeli, sugerowałbym skorzystanie z migracji, aby to zrobić. Jest to łatwy i preferowany sposób manipulowania strukturą bazy danych w Railsach. Oto jak to zrobić:
# 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
Następnie możesz uruchomić migrację za pomocą rake db:migrate
(która wywołuje self.up
metodę) i użyć rake db:rollback
(które wywołania self.down
), aby cofnąć migrację.