Chcę zmienić nazwę tabeli ... (dowolnej tabeli).
Wypróbowałem ten wiersz kodu:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Oto dziwna rzecz. Wiem, że działało za pierwszym razem, ale teraz pojawia się ten błąd: niezdefiniowana metoda `rename_table 'dla ActiveRecord :: ConnectionAdapters :: SchemaStatements: Moduł
Czy było coś, co muszę ustawić?
ruby-on-rails
Tommy
źródło
źródło
rename_table
metoda jest zdefiniowana w plikuActiveRecord::ConnectionAdapters::SchemaStatements
. Jest przeznaczony do mieszania z innymi modułami. Jeśli chcesz uruchomić to bezpośrednio, myślę, że możesz to zrobićinclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
Pamiętaj, że w Railsach> = 3.1 możesz użyć tej
change
metody.źródło
:old_table_name
do:new_table_name
.rename_table
jest metodą instancji, a nie metodą klasową, więc wywołanieClass.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 kameryclass 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 przezModel.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ć:
Następnie możesz uruchomić migrację za pomocą
rake db:migrate
(która wywołujeself.up
metodę) i użyćrake db:rollback
(które wywołaniaself.down
), aby cofnąć migrację.źródło
rename_table
jest to metoda instancji, ale nie jest zdefiniowana w klasie, więc Twoja sugestia wywołaniaClass.new.method
nie zadziała (na przykład:ActiveRecord::ConnectionAdapters::SchemaStatements.new
wyświetlaoMethodError: undefined method
nowy błąd 'for ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module`rake db:migrate
lubrake db:rollback
nie zmienisz nazwy pliku model.rb. Będziesz musiał ręcznie zmienić plik model.rb.def change
rename_table :my_table, :my_new_table
end
. . . . . Przy okazji: wewnątrzchange
wam używać tych poleceń:add_column
,add_index
,add_timestamps
,create_table
,remove_timestamps
,rename_column
,rename_index
,rename_table
źródło