Ini bagian dari pertanyaan Anda:
Saya tahu kita dapat membuatnya secara manual di PostgreSQL, tetapi "keajaiban" dengan Rekaman Aktif adalah database dapat dibuat ulang dengan semua model.
memberi tahu saya bahwa Anda benar-benar mencari cara untuk mengintegrasikan fungsi PostgreSQL dengan proses migrasi Rails normal dan tugas Rake seperti db:schema:load
.
Menambahkan dan menghapus fungsi dalam migrasi itu mudah:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
Anda perlu menggunakan up
yang terpisah dan down
metode alih-alih satu change
metode karena ActiveRecord tidak akan tahu bagaimana menerapkan apalagi membalikkan pembuatan fungsi. Dan Anda menggunakan connection.execute
untuk memasukkan definisi fungsi mentah ke PostgreSQL. Anda juga dapat melakukannya dengan reversible
di dalam change
:
def change
reversible do |dir|
dir.up do
connection.execute(%q(
create or replace function ...
))
end
dir.down do
connection.execute(%q(
drop function ...
))
end
end
end
tapi menurut saya itu lebih berisik daripada up
dan down
.
Namun, schema.rb
dan tugas Rake biasa yang bekerja dengan schema.rb
(seperti db:schema:load
dan db:schema:dump
) tidak akan tahu apa yang harus dilakukan dengan fungsi PostgreSQL dan hal-hal lain yang tidak dimengerti ActiveRecord. Ada cara untuk mengatasinya, Anda dapat memilih untuk menggunakan structure.sql
file alih-alih schema.rb
dengan menyetel:
config.active_record.schema_format = :sql
di config/application.rb
your Anda mengajukan. Setelah itu, db:migrate
akan menulis db/structure.sql
file (yang hanya merupakan dump SQL mentah dari database PostgreSQL Anda tanpa data Anda) alih-alih db/schema.rb
. Anda juga akan menggunakan tugas Rake yang berbeda untuk bekerja dengan structure.sql
:
db:structure:dump
bukannyadb:schema:dump
db:structure:load
bukannyadb:schema:load
Segala sesuatu yang lain harus bekerja sama.
Pendekatan ini juga memungkinkan Anda menggunakan hal-hal lain dalam database Anda yang ActiveRecord tidak akan mengerti:PERIKSA batasan, pemicu, default kolom yang tidak sederhana, ...