2012-03-08 14 views
9

Bir üretim veritabanına bir dizin eklemek istiyorum. Neyse ki, eşzamanlı indekslemeye izin veren Postgres'i kullanıyoruz, bu yüzden kesinti olmadan bir endeks ekleyebiliriz. Yakalama eşzamanlı dizinler bir işlem içerisinden eklenemez ve raylar geçişler her şeyi bir işlemin içine kaydırır.Rails 3.1 geçişi bir işlemde çalışırken nasıl durdurulur?

Neyse ki, gerçekten basit bir çözüm gibi görünen bir şey var: ActiveRecord :: Migration private method ddl_transaction'ın üzerine yazarak explained here.

class IndexUsersEmails < ActiveRecord::Migration 
    def ddl_transaction(&block) 
    block.call # do not start a transaction 
    end 

    def self.up 
    execute "CREATE INDEX CONCURRENTLY index_users_on_email ON users(email)" 
    end 
end 

Sorun şu ki, Rails 3.1'de çalışmıyor gibi görünüyor. Gist’teki kodun tam olarak ne yaptığını yapıyorum ve raylar onu tamamen görmezden geliyor. Bununla nereye gideceğiniz hakkında bir fikrin var mı?

+0

bunu bir sınıf yöntemi olacak şekilde yöntem tanımını değiştirerek denediniz mi? Örneğin. 'def self.ddl_transaction (& blok) ...' –

cevap

11

Burada bir cevabı asla kabul etmediğimi fark ettim, bu yüzden yaptığım şeyi söylemeliyim. çıkıyor böyle işlem çıkabiliriz:

class AddFbPageIdIndexToTabs < ActiveRecord::Migration 
    def up 
    execute "END" 
    execute "CREATE INDEX CONCURRENTLY bob_lob_law_index ON bob_lob (law)" 
    execute "BEGIN" 
    end 

    def down 
    execute "END" 
    execute "DROP INDEX CONCURRENTLY bob_lob_law_index" 
    execute "BEGIN" 
    end 
end 

Sadece işlem dışında çalıştırmak istediğiniz şey önce bir execute "END" çalıştırın. Bu, ActiveRecord :: Migration'ın geçiş için otomatik olarak ayarlandığı işlemi sonlandıracaktır. İşlemin dışında çalıştırmak istediğiniz kodla bittikten sonra, execute "BEGIN" yeni bir işlem açar, böylece ActiveRecord :: Migration kendi temizleme işleminden geçebilir ve açıldığını düşündüğü işlemi kapatabilir.

(ben bu hileyi buldum nereye çevrimiçi unutmak ve şimdi bulamıyorum. Düzenlemeler, bu kaynak hoş geldiniz!)

1

Bunu yapmanın "doğru yol" olduğunu söylemiyorum, ama benim için işe yarayan şey, yalnızca bir tane yalıtımı aşmaktı. 20120801151807 CREATE INDEX eş zamanlı olarak göç zaman damgası olup

rake db:migrate:up VERSION=20120801151807 

.

Görünüşe göre, tek bir geçiş yaptığınızda bir işlem kullanmıyor.

İlgili konular