2010-03-01 7 views
10

저는 Rails가 아닌 웹 앱에서 작업 중이므로 기본적으로 마이그레이션 스크립트가 없습니다.ActiveRecord가 마이그레이션 외부에서 테이블을 만들 수 있습니까?

속편 ORM 날 스크립트에서 쉽게 테이블을 만들 수 있습니다 :

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sequel' 

## Connect to the database 
DB = Sequel.sqlite('./ex1.db') 

unless DB.table_exists? :posts 
    DB.create_table :posts do 
    primary_key :id 
    varchar :title 
    text :body 
    end 
end 

방법의 할 일이이 마이그레이션의 외부 액티브와 함께 있습니까?

+0

최근 버전의 Sequel에서는 다음을 할 수 있습니다. DB.create_table? : posts do primary_key : id varchar : title 본문 : end 이미 존재하지 않는 한 테이블을 생성합니다. –

+0

팁 주셔서 감사합니다. Jeremey – Morgan

답변

19

현재 나의 이해는 아니오입니다. 모든 수정 데이터 또는 스키마는 마이그레이션을 통해 수행되어야합니다. 레일스 외부에서 마이그레이션을 수행하는 데 사용할 수있는 a complete rakefile on github이 있습니다.

또는 초기화 스크립트 일 경우 다음을 사용할 수 있습니다. 적어도 레일 4에서

ActiveRecord::Base.establish_connection(
    :adapter => 'sqlite3', 
    :database => './lesson1_AR.db' 
) 

ActiveRecord::Migration.class_eval do 
    create_table :posts do |t| 
     t.string :title 
     t.text :body 
    end 

    create_table :people do |t| 
     t.string :first_name 
     t.string :last_name 
     t.string :short_name 
    end 

    create_table :tags do |t| 
     t.string :tags 
    end 
end 
+0

이 '이전'은 다른/나던이 존재하는 경우에만 테이블을 생성합니까? – nterry

+0

@nryry 이미 존재한다면 실패 할 것이라고 생각합니다. – Morgan

11

(아마도 이전?), 마이그레이션과 같은 구문을 사용하여 직접 ActiveRecord::ConnectionAdapters 인스턴스 create table를 호출 할 수 있습니다.

ActiveRecord::Base.connection으로 전화하여 데이터베이스 연결을 얻을 수 있습니다 (데이터베이스가 하나만 있다고 가정).

unless ActiveRecord::Base.connection.table_exists?(:posts) 
    ActiveRecord::Base.connection.create_table :posts do |t| 
    # :id is created automatically 
    t.string :title 
    t.text :body 
    end 
end 

주 : 그래서, 당신의 예를 들어 루비의 모습 이미 모델을 정의하는 경우, 그것은 당신이 테이블을 만들려는 것과 동일한 데이터베이스를 사용하여, 당신은 잡아 수 있습니다 거기에서 대신 연결 개체. 콘솔에서 일회성 테이블을 만들려면 입력이 적기 때문에 User.connection.create_table이라고 부릅니다.

+0

스키마 정의에서 테이블을 생성하기 위해 저장된 블록에 어떻게 접근 할 수 있습니까? 서로 다른 연결을 사용하는 다른 데이터베이스에 똑같은 테이블을 만들고 싶습니다. – Hendrik

관련 문제