.rename_table
เป็นวิธีการแบบอินสแตนซ์ไม่ใช่วิธีการเรียนดังนั้นการเรียกใช้Class.method
จะไม่ทำงาน Class.new.method
แต่คุณจะต้องสร้างอินสแตนซ์ของระดับชั้นและเรียกวิธีการในกรณีเช่นนี้
[แก้ไข] ในกรณีActiveRecord::ConnectionAdapters::SchemaStatements
นี้ไม่ได้เป็นคลาส (ตามที่ระบุโดยลูกเบี้ยว) ซึ่งหมายความว่าคุณไม่สามารถสร้างตัวอย่างได้ตามที่ฉันพูดไว้ข้างต้น และแม้ว่าคุณจะใช้ตัวอย่างจากกล้องแคมของclass Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
มันก็ยังไม่ทำงานตามที่rename_table
ยกข้อยกเว้น
ในทางตรงกันข้ามActiveRecord::ConnectionAdapters::MysqlAdapter
เป็นคลาสและเป็นไปได้ว่าคลาสนี้คุณจะต้องใช้เพื่อเปลี่ยนชื่อตารางของคุณ (หรือ SQLite หรือ PostgreSQL ขึ้นอยู่กับฐานข้อมูลที่คุณใช้) ตอนนี้มันเกิดขึ้นActiveRecord::ConnectionAdapters::MysqlAdapter
แล้วและสามารถเข้าถึงได้ผ่านทางModel.connection
ดังนั้นคุณควรจะสามารถทำModel.connection.rename_table
โดยใช้รูปแบบใด ๆ ในใบสมัครของคุณ [/ แก้ไข]
อย่างไรก็ตามหากคุณต้องการเปลี่ยนชื่อตารางอย่างถาวรฉันขอแนะนำให้ใช้การย้ายข้อมูลเพื่อดำเนินการ ง่ายและวิธีที่ต้องการในการจัดการโครงสร้างฐานข้อมูลของคุณด้วย Rails นี่คือวิธีการ:
# 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
จากนั้นคุณสามารถเรียกใช้การโยกย้ายของคุณด้วยrake db:migrate
(ซึ่งเรียกself.up
วิธีการ) และใช้rake db:rollback
(ที่เรียกself.down
) เพื่อยกเลิกการโยกย้าย