.rename_tablelà một phương thức cá thể, không phải là một phương thức lớp, vì vậy việc gọi Class.methodsẽ không hiệu quả. Thay vào đó, bạn sẽ phải tạo một thể hiện của lớp và gọi phương thức trên thể hiện, như thế này : Class.new.method.
[EDIT] Trong trường hợp này, ActiveRecord::ConnectionAdapters::SchemaStatements thậm chí không phải là một lớp (như được chỉ ra bởi cam), điều đó có nghĩa là bạn thậm chí không thể tạo một thể hiện của nó theo như những gì tôi đã nói ở trên. Và ngay cả khi bạn đã sử dụng ví dụ của cam class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;, nó vẫn không hoạt động như rename_tablemột ngoại lệ.
Mặt khác, ActiveRecord::ConnectionAdapters::MysqlAdapter là một lớp và có khả năng lớp này bạn phải sử dụng để đổi tên bảng của mình (hoặc SQLite hoặc PostgreQuery, tùy thuộc vào cơ sở dữ liệu nào bạn đang sử dụng). Bây giờ, như nó xảy ra, ActiveRecord::ConnectionAdapters::MysqlAdapterđã có thể truy cập thông qua Model.connection, vì vậy bạn sẽ hoàn toàn có thể làm được Model.connection.rename_table, sử dụng bất kỳ mô hình nào trong ứng dụng của bạn. [/BIÊN TẬP]
Tuy nhiên, nếu bạn muốn đổi tên vĩnh viễn một bảng, tôi sẽ đề nghị sử dụng di chuyển để thực hiện. Thật dễ dàng và là cách ưa thích để thao tác cấu trúc cơ sở dữ liệu của bạn với Rails. Đây là cách thực hiện:
# 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
Sau đó, bạn có thể chạy di chuyển của mình với rake db:migrate(gọi self.upphương thức) và sử dụng rake db:rollback(gọi self.down) để hoàn tác di chuyển.