Tôi chỉ làm điều này trong một sự chuyển đổi
class AddCryptoToDb < ActiveRecord::Migration
def up
execute <<-SQL
CREATE extension IF NOT EXISTS pgcrypto;
SQL
end
end
Bạn có thể thực hiện bất kỳ sql nào muốn ở đó. Tôi cũng làm điều đó cho các chức năng
class BuildFnSetWebUsersUid < ActiveRecord::Migration
def up
say "building fn_set_web_users_uid function"
execute <<-SQL
CREATE OR REPLACE FUNCTION fn_set_web_users_uid()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.uid IS NULL THEN
SELECT UID into NEW.uid
FROM generate_series(10000, (SELECT last_value FROM web_users_uid_seq)) AS s(uid)
EXCEPT
SELECT uid FROM web_users
ORDER BY uid;
IF NEW.uid is NULL THEN
SELECT nextval('web_users_uid_seq') INTO NEW.uid;
END IF;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql';
SQL
end
def down
execute "DROP FUNCTION IF EXISTS fn_set_web_users_uid;"
end
end
Ngoài ra, nó không cần phải là người dùng postgres, phụ thuộc vào phần mở rộng cần phải là người dùng siêu dữ liệu hoặc chủ cơ sở dữ liệu. Vì vậy, trên hộp dev của tôi, tôi cung cấp cho người dùng quyền siêu người dùng để dễ sử dụng.