2009-08-04 11 views

Odpowiedz

10

Możesz po prostu zapisać je w pliku tekstowym i wczytać za pomocą obiektu File.

sql = "" 
source = File.new("./sql/procedures.sql", "r") 
while (line = source.gets) 
    sql << line 
end 
source.close 
execute sql 

Jest brzydki, ale działa. Zdecydowanie zaleciłbym przechowywanie zapisanych procedur/wyzwalaczy w ramach migracji w celu łatwego wycofania zmian.

Jeśli do metody „zewnętrzny” plik, musisz utrzymać dwóch dodatkowych plików na migracji, po jednym dla dodając wszystkie rzeczy i jeden dla odchodów w przypadku:

rake db:rollback 
+2

ActiveRecord :: Base .establish_connection ActiveRecord :: Base.connection.execute (sql) – drhenner

2

Odpowiedź Mike'a działa bez problemów, jeśli masz tylko jedną instrukcję w pliku, ale jeśli jest więcej instrukcji (na przykład wiele wstawień i aktualizacji), funkcja ActiveRecord nie powiedzie się, ponieważ nie obsługuje wielu instrukcji z jednym wywołaniem domyślnie.

Jednym z rozwiązań byłoby zmodyfikowanie ActiveRecord do obsługi wielu instrukcji, zgodnie z instrukcją here.

Inne rozwiązanie byłoby zapewnienie, że plik SQL zawiera tylko jedną instrukcję w każdym wierszu i użyć pętli jak

source = File.open "db/foo.sql", "r" 
source.readlines.each do |line| 
    line.strip! 
    next if line.empty? # ensure that rows that contains newlines and nothing else does not get processed 
    execute line 
end 
source.close 
2

Zrobiłem następujące gdzie potrzebne:

class RawSqlMigration < ActiveRecord::Migration 
    def up 
    execute File.read(File.expand_path('../../sql_migrations/file.sql', __FILE__)) 
    end 
end 
Powiązane problemy