2013-02-13 31 views
40

मैं निम्नलिखित एसक्यूएल जो मैंरेल

CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users; 

DROP TABLE cars_users; 

ALTER TABLE cars_users2 RENAME TO cars_users; 

करने के लिए के बाद से मैं Heroku एक मेज ड्रॉप करने dataclips उपयोग नहीं कर सकते की जरूरत है, मैं dataclips उपयोग नहीं कर सकते में एक प्रवास में एसक्यूएल लिखने के लिए कैसे।

तो मुझे लगता है कि मुझे माइग्रेशन में ऐसा करने की आवश्यकता है।

मैं इस एसक्यूएल को माइग्रेशन के रूप में कैसे लिखूं?

उत्तर

79

अपने ऊपर प्रवास के लिए:

execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;" 
drop_table :car_users 
rename_table :car_users2, :car_users 

और नीचे के लिए:

raise ActiveRecord::IrreversibleMigration 

पूर्ण माइग्रेशन:

class TheMigration < ActiveRecord::Migration 
    def up 
     execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * from cars_users;" 
     drop_table :car_users 
     rename_table :car_users2, :car_users 
    end 

    def down 
     raise ActiveRecord::IrreversibleMigration 
    end 
end 
16

आप execute विधि का उपयोग करने का प्रयास कर सकते हैं।

कुछ इस तरह

class UpdateCarUserTable < ActiveRecord::Migration 
    def up 
    execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users" 
    execute "DROP TABLE cars_users" 
    execute "ALTER TABLE cars_users2 RENAME TO cars_users" 
    end 

(यह अपरीक्षित, दिमाग की उपज किसी तरह का है) नहीं है के रूप में कोई समकक्ष down विधि, एक ActiveRecord::IrreversibleMigration जब नीचे की ओर पलायन करने की कोशिश कर उठाया जाना चाहिए।

2

मैं यहाँ पसंद करते हैं डॉक:

execute <<-SQL 
    CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users; 
    DROP TABLE cars_users; 
    ALTER TABLE cars_users2 RENAME TO cars_users; 
SQL 

नोटिस: यह केवल PostgreSQL लिए काम करता है, अगर आप MySQL का उपयोग कर रहे आप एडाप्टर के लिए CLIENT_MULTI_STATEMENTS स्थापित करना चाहिए।

+1

तुम ऐसा क्यों करना चाहते हैं? – marvindanig

3

यदि आपको up और down के बजाय change का उपयोग करने की आवश्यकता है तो आप reversible का उपयोग कर सकते हैं। यह रेल 4 या उससे ऊपर के काम करता है।

class ExampleMigration < ActiveRecord::Migration 
    def change 
    create_table :distributors do |t| 
     t.string :zipcode 
    end 

    reversible do |dir| 
     dir.up do 
     # add a CHECK constraint 
     execute <<-SQL 
      ALTER TABLE distributors 
      ADD CONSTRAINT zipchk 
       CHECK (char_length(zipcode) = 5) NO INHERIT; 
     SQL 
     end 
     dir.down do 
     execute <<-SQL 
      ALTER TABLE distributors 
      DROP CONSTRAINT zipchk 
     SQL 
     end 
    end 

    add_column :users, :home_page_url, :string 
    rename_column :users, :email, :email_address 
    end 
end 

सूत्रों का कहना है: http://edgeguides.rubyonrails.org/active_record_migrations.html#using-reversible

https://apidock.com/rails/ActiveRecord/Migration/reversible

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

  • कोई संबंधित समस्या नहीं^_^