2010-03-01 7 views
10

मैं एक गैर रेल वेब ऐप पर काम कर रहा हूं, इसलिए डिफ़ॉल्ट रूप से कोई माइग्रेशन स्क्रिप्ट नहीं है।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 

वहाँ एक रास्ता कार्य करने माइग्रेशन के बाहर ActiveRecord के साथ इस है?

+0

ध्यान दें कि सीक्वेल के हाल के संस्करणों के साथ आप कर सकते हैं: डीबी.क्रेट_टेबल? : आईडी varchar: शीर्षक पाठ: पदों primary_key कर शरीर अंत जब तक यह पहले से मौजूद है कौन सा तालिका का निर्माण करेगा। –

+0

टिप जेरेमी – Morgan

उत्तर

19

मेरी वर्तमान समझ नहीं है, सभी संशोधन डेटा या स्कीमा माइग्रेशन के माध्यम से किया जाना है। मेरे पास a complete rakefile on github है जिसका उपयोग रेल के बाहर माइग्रेशन करने के लिए किया जा सकता है।

वैकल्पिक रूप से यदि यह केवल प्रारंभिक स्क्रिप्ट है तो निम्नलिखित का उपयोग किया जा सकता है।

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

@nterry मुझे लगता है कि यह असफल हो जाएगा अगर यह पहले से मौजूद है। – Morgan

11
रेल 4 में कम से कम (संभवतः पहले?), आप सीधे एक 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

संबंधित मुद्दे