2012-11-01 24 views
30

मेरे पास यह परीक्षणडेटाबेस है, जो अब तक, जंक के साथ भरा हुआ है। अब मैंने रेल कंसोल में कुछ table.destroy_all कमांड किए हैं जो सभी रिकॉर्ड और निर्भरताओं को हटा देता है जो कमाल है। तथापि; मैं सबकुछ छीनना चाहता हूं ताकि आईडी आदि फिर से शुरू हो जाएं। क्या रेल 3 में कोई रास्ता है?रेल कंसोल के साथ छंटनी तालिका (0)

उत्तर

104

स्वीकार किए जाते हैं जवाब ही काम करता है।
एक एकल तालिका (कॉलबैक के साथ) ड्रॉप करने के लिए और आईडी 1 से शुरू करने के लिए प्राप्त करने के लिए:

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY") 

आप SQLite का उपयोग कर रहे हैं, तो यह छोटा कर देते तो निम्न कार्य का समर्थन नहीं करता:

Model.destroy_all # Only necessary if you want to trigger callbacks. 
ActiveRecord::Base.connection.execute("Delete from #{table_name}") 
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'") 
+2

आपका जवाब सही है जब एक टेबल को छोटा किया जाना चाहिए (और मैं इसके लिए धन्यवाद) मैंने यम मार्कोविक जवाब को स्वीकृत उत्तर के रूप में चुना है क्योंकि मैंने "सबकुछ" को छोटा करने के लिए कहा था। – CaptainCarl

+4

वोट के लिए धन्यवाद। पूरे डीबी आवश्यकता सवाल से स्पष्ट नहीं था!बस जानकारी के लिए, रेक डीबी: ड्रॉप डेटाबेस ड्रॉप जाएगा। यदि आवश्यकता है कि सभी तालिकाओं को छोटा कर दें, तो आप ActiveRecord :: Base.connection.tables.collect {| table_name | ActiveRecord :: Base.connection.execute ("TRUNCATE # {table_name}")}। हालांकि यह कॉलबैक का ख्याल नहीं रख सकता है, मुझे लगता है कि यह आवश्यक नहीं है क्योंकि हम सभी तालिकाओं को छोटा कर रहे हैं। –

+0

destroy_all प्रत्येक रिकॉर्ड पर नष्ट हो जाएगा, जो तालिका को छोटा करने से काफी अलग है। डॉक्स से: # प्रत्येक # रिकॉर्ड को चालू करके और + नष्ट + विधि को कॉल करके रिकॉर्ड + शर्तों से मेल खाने वाले रिकॉर्ड्स को नष्ट कर देता है। प्रत्येक ऑब्जेक्ट का कॉलबैक # निष्पादित किया गया है ( सहित: निर्भर एसोसिएशन विकल्प और # + first_destroy +/+ after_destroy + पर्यवेक्षक विधियां)। # नष्ट किए गए ऑब्जेक्ट्स का संग्रह लौटाता है; प्रत्येक को जमे हुए, पर # प्रतिबिंबित किया जाएगा कि कोई भी परिवर्तन नहीं किया जाना चाहिए (क्योंकि वे # जारी नहीं हो सकते हैं)। – justingordon

3

बस अगले टेस्ट रन पर डेटाबेस का पुनर्निर्माण करें (यह इसे छोड़ने के बाद स्वचालित रूप से हो जाएगा)। अगर आप पूरे डेटाबेस से बनाना होगा

rake db:drop RAILS_ENV=test

3

आप rake db:rollback STEP=3 RAILS_ENV=test

भी कर सकते हैं जहां 3 डीबी/माइग्रेट में आपके माइग्रेशन की संख्या का प्रतिनिधित्व करता है। उदाहरण में: यदि मेरे पास

db/migrate 
20140121065542_create_users.rb 
20140121065710_create_profiles.rb 
20140121065757_create_articles.rb 
20140121065900_create_comments.rb 
20140121065929_create_categories.rb 

तो मेरे पास कुल निकालने के लिए 5 माइग्रेशन हैं। अगर मैं rake db:rollback STEP=5 RAILS_ENV=test करता हूं तो सभी टेबल मेरे टेस्ट डेटाबेस से ड्रॉप हो जाएंगे और यदि मैं सभी पर्यावरण (उत्पादन, परीक्षण, विकास) तालिकाओं से RAILS_ENV = परीक्षण को हटा दूंगा तो यह हटा दिया जाएगा और यह माइग्रेशन डेटा से डीबी/shema.rb फ़ाइल को भी साफ़ करता है ।

2

rake db:resetrake db:drop db:setup प्रदर्शन करेगा। दूसरे शब्दों में, डेटाबेस ड्रॉप करें और डेटाबेस को फिर से सेटअप करें।

Source

+0

ऐसा करके, हम महत्वपूर्ण डेटा खो देंगे, अत्यधिक अनुशंसित नहीं है। –

0

(पार्टी के लिए देर से थोड़ा, मुझे पता है)

कंसोल में यह करने के लिए पूछ रहा है:

2.1.2 :001 > Post.all.each do |post| 
2.1.2 :002 > post.destroy! 
2.1.2 :003 > end 

रूप में अच्छी तरह से काम करता है ...

यह अनिवार्य रूप से सभी पदों के माध्यम से loops और उन्हें नष्ट कर देता है। यह अपने ऑटो वृद्धि मान नहीं बदलता है, हालांकि ...

एक ही तर्क रेल 3 रूप में अच्छी तरह के लिए काम करना चाहिए

+2

1. 'प्रत्येक' का उपयोग न करें, 'find_each' का उपयोग करें। यह सुनिश्चित करता है कि आपको एक प्रश्न में एक बिलियन रिकॉर्ड्स नहीं मिलेगा। यदि आपको डीबी से रिकॉर्ड्स को हटाने की आवश्यकता है (बिना किसी कॉलबैक के)। बस 'Post.delete_all' करें – Kukunin

4

यह मेरे लिए काम किया >>> ActiveRecord :: बेस (हालांकि मैं रेल 4 का उपयोग कर रहा)। connection.execute ("TRUNCATE TABLE_NAME")

1

आप MySQL या Postgre और नहीं sqlite3 (TRUNCATE का समर्थन नहीं करता है) का उपयोग कर रहे मानते हुए, तुम कर सकते हो निम्नलिखित: इस होगा कि

MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) } 

नोट ActiveRec का आह्वान न करें ord कॉलबैक।