2013-05-17 26 views
19

Sẽ rất đáng yêu nếu lệnh rake db:create có thể được theo sau bởi tập lệnh cài đặt postgresql. Điều này, ví dụ. (Nó phải được chạy dưới dạng người dùng postgres):Làm thế nào để cài đặt phần mở rộng Postgres khi tạo cơ sở dữ liệu?

CREATE EXTENSION "fuzzystrmatch"; 

Điều này bởi vì, trong thời điểm này, tôi đang thực hiện thủ công mỗi khi tôi tạo cơ sở dữ liệu.

Bất kỳ gợi ý nào?

Trả lời

47

Tính đến Rails 4, có một phương pháp enable_extension:

class AddFuzzyStringMatching < ActiveRecord::Migration 
    def change 
    enable_extension "fuzzystrmatch" 
    end 
end 
5

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.

Các vấn đề liên quan