레일에서 테이블 이름 바꾸기


154

테이블 이름을 바꾸고 싶습니다 ... (모든 테이블)

이 코드 줄을 사용해 보았습니다.

ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)

이상한 것이 있습니다. 처음으로 작동한다는 것을 알고 있지만 이제는 다음과 같은 오류가 발생합니다.

설정해야 할 것이 있습니까?

답변:


248

일반적으로 마이그레이션에서 다음과 같은 작업을 수행합니다.

class RenameFoo < ActiveRecord::Migration
  def self.up
    rename_table :foo, :bar
  end

  def self.down
    rename_table :bar, :foo
  end
end

1
고마워요! 나는 왜 여전히 이전 줄이 그렇지 않은지 의아해합니다. 잘 ..
Tommy

@Tommy, rename_table메소드는에 정의되어 있습니다 ActiveRecord::ConnectionAdapters::SchemaStatements. 다른 모듈과 혼합되어 있습니다. 직접 실행하고 싶다면 할 수 있다고 생각합니다include ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
cam

또는 기울어 진 경우 ActiveRecord :: Migration.rename_table (: foo, : bar)을 사용할 수 있습니다. 그러나 마이그레이션이 가장 효과적입니다. 모델 이름을 변경하거나 모델 이름을 이전 이름으로 유지 하시겠습니까? 그렇다면 "set_table_name : bar"를 사용하여 ActiveRecord 모델에서 테이블 이름을 지정할 수 있습니다.
Aditya Sanghi

1
위 / 아래 대신 'change'방법으로 마이그레이션에 새 양식을 사용할 수도 있습니다.
MegaTux

최신 Rails 구현에서 def self.up / def.self.down이 아닌 def 변경. 후자를하는 것은 조용히 실패합니다.
huertanix

294

Rails> = 3.1에서는이 change방법을 사용할 수 있습니다 .

 class RenameOldTableToNewTable < ActiveRecord::Migration
   def change
     rename_table :old_table_name, :new_table_name
   end 
 end

37
또한 모든 인덱스를 다음 :old_table_name으로 마이그레이션합니다.:new_table_name
Gavin Miller

7
약간의 논평 : 아마도 : old_named_things, : new_named_things로 변경하여 사람들에게 activerecord의 테이블 이름이 일반적으로 복수임을 상기시킵니다.
Carpela

24

.rename_table클래스 메소드가 아닌 인스턴스 메소드이므로 호출 Class.method이 작동하지 않습니다. 대신 클래스의 인스턴스를 작성하고 인스턴스에서 다음과 같이 메소드를 호출해야합니다 Class.new.method.

[편집]이 경우 ActiveRecord::ConnectionAdapters::SchemaStatements클래스도 아닙니다 (캠에서 지적한 바와 같이). 위에서 말한대로 인스턴스를 만들 수도 없습니다. 그리고의 cam 예제를 사용해도 예외가 발생 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마이그레이션을 실행 취소).


나는 동의 rename_table인스턴스 방법이지만 전화로 제안 있도록이 클래스에 정의되어 있지 Class.new.method않습니다하지 작업 (예 : ActiveRecord::ConnectionAdapters::SchemaStatements.new오류 제공 oMethodError: undefined method 하는 ActiveRecord :: ConnectionAdapters :: SchemaStatements를위한 새로운 'Module`

1
또한 테이블과 연결된 모델이 있으면 이름을 바꾸 rake db:migrate거나 실행 중이 거나 rake db:rollbackmodel.rb 파일의 이름을 바꾸지 않을 것입니다. model.rb 파일을 수동으로 변경해야합니다.
9monkeys

1
최신 Rails 버전 (예 : 5.x) 에서는 self.upself.down 대신 change 메소드를 사용할 수 있습니다. Rails도 롤백을 수행 할 수 있기 때문입니다. 따라서이 코드로 충분 합니다. . . . . 그런데 :의 내부 당신이 명령을 사용 : , , , , , , ,def change rename_table :my_table, :my_new_table endchangeadd_columnadd_indexadd_timestampscreate_tableremove_timestampsrename_columnrename_indexrename_table
뷰티

2
ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.