2010-03-01 4 views
10

Tôi đang làm việc trên ứng dụng web không phải Rails, do đó không có tập lệnh di chuyển theo mặc định.ActiveRecord có thể tạo các bảng bên ngoài di chuyển không?

Các Sequel ORM cho phép tôi tạo bảng một cách dễ dàng trong một kịch bản:

#!/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 

Có cách nào công việc này với ActiveRecord ngoài di cư?

+0

Lưu ý rằng với các phiên bản gần đây của Phần tiếp theo, bạn có thể làm: DB.create_table? : bài đăng làm primary_key: id varchar: title văn bản: nội dung kết thúc Điều này sẽ tạo bảng trừ khi nó đã tồn tại. –

+0

Cảm ơn mẹo Jeremey – Morgan

Trả lời

19

Hiểu biết hiện tại của tôi là không, tất cả dữ liệu sửa đổi hoặc giản đồ phải được thực hiện thông qua di chuyển. Tôi có a complete rakefile on github có thể được sử dụng để thực hiện di chuyển bên ngoài Rails.

Hoặc nếu nó chỉ là một tập lệnh khởi tạo, bạn có thể sử dụng sau đây.

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

Liệu 'di chuyển' này có tạo ra một bảng nếu khác biệt/không tồn tại của nó không? – nterry

+0

@nterry Tôi nghĩ rằng nó sẽ thất bại nếu nó đã tồn tại. – Morgan

11

Trong Rails 4 ít nhất (có thể sớm hơn?), Bạn có thể gọi create table trực tiếp trên một thể hiện ActiveRecord::ConnectionAdapters, sử dụng cú pháp giống như sự di cư.

Bạn có thể nhận kết nối cho cơ sở dữ liệu của mình (giả sử bạn chỉ có một cơ sở dữ liệu) bằng cách gọi ActiveRecord::Base.connection. Vì vậy, Ruby ví dụ của bạn sẽ trông như thế:

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 

Lưu ý: Nếu bạn đã có một mô hình xác định, và nó sử dụng cơ sở dữ liệu tương tự như một trong đó bạn muốn tạo bảng, bạn có thể lấy một kết nối đối tượng từ đó thay thế. Đối với việc tạo bảng một lần trong bảng điều khiển, tôi sẽ gọi User.connection.create_table đơn giản chỉ vì ít nhập văn bản hơn.

+0

Có cách nào để bạn có thể truy cập khối được lưu trữ để tạo bảng từ định nghĩa lược đồ không? Tôi muốn tạo chính xác cùng một bảng, chỉ trong một cơ sở dữ liệu khác nhau bằng cách sử dụng một kết nối khác nhau. – Hendrik