我可以在Ruby on Rails上编写PostgreSQL函数吗?
我们正在开始一个基于Ruby on Rails的项目。 我们曾经使用Perl和PostgreSQL函数,并且使用Rails和Active Record我没有看到我们应该如何在PostgreSQL中创建函数并保留Active Record和模型的记录。
我知道我们可以在PostgreSQL中手动创建它,但Active Record的“魔力”在于可以使用所有模型重新创建数据库。
有没有办法使用Rails创建PostgreSQL函数并将其保存在模型中?
这部分问题:
我知道我们可以在PostgreSQL中手动创建它,但Active Record的“魔力”在于可以使用所有模型重新创建数据库。
告诉我你正在寻找一种方法将PostgreSQL函数与普通的Rails迁移过程和Rake任务集成,例如db:schema:load
。
在迁移中添加和删除function很简单:
def up connection.execute(%q{ create or replace function ... }) end def down connection.execute(%q{ drop function ... }) end
您需要使用单独的up
和down
方法而不是单个change
方法,因为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
其他一切都应该是一样的。
这种方法还允许您使用ActiveRecord无法理解的数据库中的其他内容:CHECK约束,触发器,非简单列默认值,…
如果您的唯一要求是在Rails应用程序中的某处创建它们,可以通过ActiveRecord::Base.connection.execute
,您可以使用它来执行原始SQL查询。
stmt = 'CREATE FUNCTION...' ActiveRecord::Base.connection.execute stmt
然后你也可以使用ActiveRecord::Base.connection.execute
调用该函数(我想你的模型中有方法来处理这个问题)。
- Rails&Heroku:PG db无法创建数据库
- ProtocolViolation:ERROR:绑定消息提供0个参数,但是准备好的语句“”需要1
- rails admin列不存在
- postgresql datababse出错:服务器是否在本地运行并接受Unix域套接字“/var/run/postgresql/.s.PGSQL.5432”上的连接?
- ActionView :: Template :: Error(PG :: UndefinedFunction:ERROR:运算符不存在:整数~~未知
- Rails上的Ruby / PgSQL错误启动:无法加载这样的文件–pg_ext(LoadError)
- 包含,选择,排序,限制多个模型(单个查询)
- 由于外键约束,无法删除对象
- RoR Postgresql时区组不在Heroku上工作