我可以在Ruby on Rails上编写PostgreSQL函数吗?

Max*_*JRB 17 ruby postgresql ruby-on-rails function rails-activerecord

我们正在开始一个基于Ruby on Rails的项目.我们曾经使用Perl和PostgreSQL函数,并且使用Rails和Active Record我还没有看到我们应该如何在PostgreSQL中创建函数并保留Active Record和模型的记录.

我知道我们可以在PostgreSQL中手动创建它,但Active Record的"魔力"是可以使用所有模型重新创建数据库.

有没有办法使用Rails创建PostgreSQL函数并将其保存在模型中?

mu *_*ort 33

这部分问题:

我知道我们可以在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
Run Code Online (Sandbox Code Playgroud)

您需要使用单独updown方法,而不是一个单一的change方法,因为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
Run Code Online (Sandbox Code Playgroud)

但我觉得比那个喧闹updown.

但是,schema.rb通常使用的Rake任务schema.rb(例如db:schema:loaddb:schema:dump)将不知道如何处理PostgreSQL函数以及ActiveRecord不理解的其他内容.虽然有一种方法,你可以选择使用structure.sql文件而不是schema.rb设置:

config.active_record.schema_format = :sql
Run Code Online (Sandbox Code Playgroud)

在你的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约束,触发器,非简单列默认值,...