gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:34:15 24 4
gpt4 key购买 nike

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

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

有什么方法可以使用 Rails 创建 PostgreSQL 函数并将其保存在模型中吗?

最佳答案

这部分问题:

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

您需要使用单独的 updown 方法而不是单个 change 方法,因为 ActiveRecord 不知道如何应用,更不用说反转函数创建。然后您使用 connection.execute 将原始函数定义提供给 PostgreSQL。您也可以在 change 中使用 reversible 来做到这一点:

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 文件(这只是一个没有您的数据的 PostgreSQL 数据库的原始 SQL 转储)而不是 db/schema.rb。您还将使用不同的 Rake 任务来处理 structure.sql:

  • db:structure:dump 而不是 db:schema:dump
  • db:structure:load 而不是 db:schema:load

其他一切都应该相同。

这种方法还允许您在数据库中使用 ActiveRecord 无法理解的其他东西:CHECK 约束、触发器、非简单的列默认值......

关于ruby-on-rails - 我可以在 Ruby on Rails 上编写 PostgreSQL 函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31953498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com