2011-11-26 3 views
3

저는 Rails 3 in Action을 읽고 축 어적 명령을 따르고 있습니다. 왜 클래스 메소드가 있으며ActiveRecord :: Migration의 서브 클래스로 메소드를 위아래로 생성하지 않는 이유는 무엇입니까?

class CreatePurchases < ActiveRecord::Migration 
    def change 
    create_table :purchases do |t| 
     t.string :name 
     t.float :cost 

     t.timestamps 
    end 
    end 
end 

: 내가 대신이 코드를 얻을

class CreatePurchases < ActiveRecord::Migration 
      def self.up #not created in my code 
      create_table :purchases do |t| 
       t.string :name 
       t.float :cost 
       t.timestamps 
      end 
end 
      def self.down # not created in my code 
      drop_table :purchases 
end 
end 

: 나는 명령을 실행할 때,

rails new things_i_bought 
cd things_i_bought 
bundle install 
rails generate scaffold purchase name:string cost:float 

이 책은이 코드를 받아야 말한다 나를 위해 창조되지 않은가? 나는 레일 3.1.1과 루비 1.9.2를 사용하고 있습니다.

답변

11

내 책을 읽어 주셔서 감사합니다!

JacobM과 dbalatero가 이미 설명했듯이, 이것은 Rails 3.1의 새로운 기능입니다. 이 특정 기능은 Aaron Patterson이 마이그레이션 구문을 단순화하는 방법으로 추가되었습니다. 이전 버전의 Rails에서는 다음과 같이 책을 표시해야합니다.

class CreatePurchases < ActiveRecord::Migration 
    def self.up 
    create_table :purchases do |t| 
     t.string :name 
     t.float :cost 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :purchases 
    end 
end 

그러나 반복되는 내용입니다. Aaron은 앞선 마이그레이션에 필요한 메소드 만 호출하고 마이그레이션을 역방향으로 허용하는 "롤백"이라고도하는 마이그레이션 구문을 작성했습니다. 레일 3.1 구문을 사용하여 작성된 같은 마이그레이션은 이것이다 :

class CreatePurchases < ActiveRecord::Migration 
    def change 
    create_table :purchases do |t| 
     t.string :name 
     t.float :cost 
     t.timestamps 
    end 
    end 
end 

이 마이그레이션 실행 "앞으로이", 레일은 필드와 구매 테이블을 만들 수 있도록합니다. 그것을 롤백 (또는 "뒤로"실행)하면 Rails는 테이블을 삭제한다는 것을 알게됩니다.

그러나이 구문은 완전히 완벽하지는 않으며 change_column과 같은 문제가 발생합니다.그렇게 할 때, 마이그레이션에 def updef down 방법을 모두 정의를 고수하는 것이 가장 좋습니다 :이 예에서 레일 이전 형태로 다시 전환하는 방법을 알고하지 않기 때문이다

class CreatePurchases < ActiveRecord::Migration 
    def up 
    change_column :purchases, :cost, :integer 
    end 

    def down 
    change_column :purchases, :cost, :float 
    end 
end 

합니다. 이게 더 나아 졌으면 좋겠다.

+0

굉장해! 고마워요. – lampShade

+2

이 사이트는 사람이 굉장합니다. 질문을하고, 15 분 이내에 * 당신이 물어 본 책의 저자 *로부터 답을 얻으십시오. +1 –

0

새로운 Rails 3.1이 있다고 생각합니다. 데이터베이스 마이그레이션 방법은 위/아래 마이그레이션을 실행하는 방법을 스스로 인식합니다. 당신이 def change 방법을 정의하는 경우

따라서, 그것은 그 자체를 인식하는 방법을 사용하려고합니다 :이 경우, create_tabledown 맥락에서 DROP TABLE을 할 알고, 그리고 up 맥락에서 CREATE TABLE.

이전 스타일을 계속 사용하려는 경우 계속해서 책을 설명하는대로 계속 self.downself.up 메쏘드를 정의 할 수 있습니다.

편집 : http://www.edgerails.info/articles/what-s-new-in-edge-rails/2011/05/06/reversible-migrations/index.html

1

이는 new feature in Rails 3.1입니다 : 여기에 "가역 마이그레이션"라는이의 블로그 게시물에 대한 링크가 있습니다. Rails가 테이블 생성과 같이 역순으로 처리하는 방법을 알아낼 수있는 변경 사항의 경우 "위로"올라간 코드로 "변경"메소드를 작성하고 자신의 코드에서 "다운"하는 방법을 파악합니다 .

"위로"및 "아래로"방법을 직접 정의 할 수도 있습니다 - 일부 변경 사항 (예 : 열 삭제)은 레일스가 알아낼 수 없지만 구문이 약간 다릅니다. def self.up 대신 단지 def up이 아닙니다. 이제 클래스 메소드 대신 인스턴스 메소드가됩니다.

+0

레일 3.1.1을 실행 중입니다. 버전 번호를 이해하지 못 했습니까? – lampShade

+0

읽은 책은 Rails 3.0 (또는 3.0.1, 3.0.2 등)을 기반으로합니다. 그러나 실제로는 Rails 3.1.1을 사용하고 있으며 모든 3.1 버전에는이 새로운 기능이 있습니다. –

+0

이제 알겠습니다. 고맙습니다! – lampShade

관련 문제