我可以写在Ruby on Rails的PostgreSQL函数?

问题描述 投票:14回答:2

我们开始基于Ruby on Rails的一个项目。我们使用Perl和PostgreSQL函数的工作,并与Rails和活动记录我从来没见过,我们应该如何在PostgreSQL的创建功能,并保持纪录,活动记录和模式。

我知道我们可以在PostgreSQL的手动创建它,但“魔术”与Active Record是数据库可以与所有的模型来重新创建。

有没有办法使用Rails创建PostgreSQL的功能,并保持它的型号?

ruby-on-rails ruby postgresql function rails-activerecord
2个回答
31
投票

你的问题的这一部分:

我知道我们可以在PostgreSQL的手动创建它,但“魔术”与Active Record是数据库可以与所有的模型来重新创建。

告诉我,你真正寻找一种方式来整合PostgreSQL函数与正常的Rails迁移过程和Rake任务,例如db:schema:load

添加和删​​除迁移的功能很简单:

def up
  connection.execute(%q(
    create or replace function ...
  ))
end

def down
  connection.execute(%q(
    drop function ...
  ))
end

您需要使用的,而不是单一的up方法单独downchange方法,因为ActiveRecord的将不知道如何运用更别说扭转的功能创建。并使用connection.execute到原始函数定义喂到PostgreSQL。您也可以使用其内部reversible一个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

但我发现,比updown噪音。

然而,schema.rb以及与schema.rb工作通常Rake任务(如db:schema:loaddb:schema:dump)将不知道如何处理PostgreSQL函数和其他东西,ActiveRecord的不理解做。有解决这个虽然是这样,你可以选择通过设置使用structure.sql文件而不是schema.rb

config.active_record.schema_format = :sql

config/application.rb文件。在此之后,db:migrate会写,而不是一个db/structure.sql文件db/schema.rb(这只是你的PostgreSQL数据库的原始SQL转储没有你的数据)。您还可以使用不同的Rake任务与structure.sql工作:

  • db:structure:dump代替db:schema:dump
  • db:structure:load代替db:schema:load

其他的一切应该工作一样。

这种方法,您还可以使用其他的东西在你的数据库的ActiveRecord不会明白:CHECK约束,触发器,非笨笨列缺省值,...


0
投票

如果你唯一的要求是在你的Rails应用程序的某个地方创建它们,这是可能的,通过ActiveRecord::Base.connection.execute,你可以用它来执行原始的SQL查询。

stmt = 'CREATE FUNCTION...'
ActiveRecord::Base.connection.execute stmt

然后,您可以使用ActiveRecord::Base.connection.execute以及调用函数(我想像你会在你的模型来处理这个方法)。

© www.soinside.com 2019 - 2024. All rights reserved.