我知道我们可以在Postgresql中手动创建它,但Active Record的“魔力”在于可以使用所有模型重新创建数据库.
解决方法
I know we can create it manually in Postgresql,but the “magic” with Active Record is that the database can be recreated with all the models.
告诉我你正在寻找一种方法将Postgresql函数与普通的Rails迁移过程和Rake任务集成,例如db:schema:load.
def up connection.execute(%q{ create or replace function ... }) end def down connection.execute(%q{ drop function ... }) end
您需要使用单独的向上和向下方法而不是单个更改方法,因为ActiveRecord将不知道如何应用更不用说反向创建函数.并使用connection.execute将原始函数定义提供给Postgresql.
但是,schema.rb和使用schema.rb的常用Rake任务(例如db:schema:load和db:schema:dump)将不知道如何处理Postgresql函数以及ActiveRecord不理解的其他内容.虽然有一种方法,你可以选择使用structure.sql文件而不是schema.rb设置:
config.active_record.schema_format = :sql
在您的config / application.rb文件中.之后,db:migrate将编写db / structure.sql文件(这只是没有数据的Postgresql数据库的原始sql转储)而不是db / schema.rb.您还将使用不同的Rake任务来处理structure.sql:
> db:structure:dump而不是db:schema:dump
> db:structure:load而不是db:schema:load
其他一切都应该是一样的.