【问题标题】:How to organise advanced SQL in Rails app [closed]如何在 Rails 应用程序中组织高级 SQL [关闭]
【发布时间】:2013-01-16 22:38:31
【问题描述】:

有哪些选项可以在 Rails 应用程序中组织更高级(因此更复杂和更大)的 SQL 查询?

目的:

  • 将 SQL 和相关规范保留在常规位置。
  • 将更大、更可重用的 SQL 提取到 SQL 函数、视图、触发器中(那么如何维护 func、视图的代码?迁移可能不是最佳选择)
  • 将 SQL 的 sn-ps 作为 AR 的一部分或作为独立的一部分重用。
  • 利用大部分底层数据库功能(例如 PostgreSQL CTE、FTS、扩展等)。
  • 保持 SQL 的可管理性、可维护性。

【问题讨论】:

  • 我认为这是一个偏好问题,但我可能会使用单独的只读模型将更复杂的查询实现为视图(数据库类型的视图,而不是 rails 类型)。然后,这些模型可以声明has_one(Foo) 以与表模型相关联(此注释写起来令人困惑:D)。
  • @Tim 但您仍然想测试这些视图并将代码保存在某处。你在哪里做的?
  • 啊,我明白你的意思了。我主要使用将管理数据库服务器上的脚本的 Oracle DB。我想您可以将源放入 config/database/sql 之类的东西,因为它们是静态的。不过这有点令人困惑。抱歉,我想我一开始并没有完全理解这个问题。
  • 我不确定所有的 SQL 都是静态的。有时它会使用一些插值来将脚本应用于特定的用例,而不是重新复制它。

标签: sql ruby-on-rails ruby conventions


【解决方案1】:

我会考虑将所有内容打包为独立的 gem/Rails 引擎。

所有必要的自定义 SQL 迁移(创建视图、函数、存储过程等的代码)都可以放在 /db/migrations/sql 中,并且可以编写自定义 Rake 任务来运行这些迁移。

然后您可以编写各种测试/规范来练习您的数据库特定视图、函数、存储过程等。

此 gem 将有自己的源代码库,并且可以有自己的生命/发布周期,所有这些都独立于您的主应用程序。可以想象,它可以由 Ruby 专家(用于 gem、specs、库)和 SQL 专家(显然)组成。

如果这个库/API 编写得很好,那么这将为您带来额外的好处,即从低级、特定于数据库的代码中抽象出您的主应用程序。也就是说,应用程序开发人员只需要担心调用Widget.complex_sql_query 并处理它的返回值,而不必担心维护它。相反,数据库后端团队不必太担心他们的代码是如何使用的——只要两个团队都同意 API 合同并且所有测试覆盖率都很好。

这可以通过与主应用程序集成的所有代码来完成,但将所有内容都作为单独的 gem 会造成身体和心理障碍,让两个团队更容易专注于各自的责任领域。

【讨论】:

  • 那肯定有点过分了。
猜你喜欢
  • 2011-05-19
  • 2010-10-05
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
相关资源
最近更新 更多