.rename_table
là 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.method
sẽ 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_table
mộ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.up
phương thức) và sử dụng rake db:rollback
(gọi self.down
) để hoàn tác di chuyển.