23

我是一个拥有 6 年经验的 .net 人。最近我开始研究 ROR 项目,并意识到根本没有使用存储过程/sql 函数。在询问它时,我知道这是一种常见的做法,通常团队中根本没有人编写 sql 查询,一切都是使用 ActiveRecord 完成的。

我用谷歌搜索了任何可能的原因,但没有找到太多信息。所以我只是好奇地知道

  1. 不喜欢使用存储过程/sql函数是常见的做法吗?
  2. 使用存储过程的优缺点是什么?
4

4 回答 4

35

不喜欢使用存储过程/sql函数是常见的做法吗?

这是常见的,大多数 Rails 应用程序永远不需要使用 ActiveRecord 以外的任何东西。

Rails 背后的主要理念之一是,将一个有效的产品推向市场比在 6 个月后将一个“快速”的产品推向市场更重要。你的产品几乎肯定永远不会流行到足以让性能成为问题的程度。如果这确实成为问题,您可以在以后支持性能方面,但当务之急是能够快速构建应用程序,并能够快速重构部分或全部以响应您的市场。

使用存储过程的优缺点是什么?

它们的编写速度较慢且更难更改,因此会预先增加您的开发成本。但是,它们可以更快地执行。

于 2013-03-20T07:20:30.753 回答
8

使用存储过程可能不是“rails 方式”,但它也曾经不是使用外键成本约束的“rails 方式”,我们都知道结果是一个非常糟糕的设计决策。

所以我会采取“铁轨方式”与一粒盐。如果存储过程适合您,请使用它们。

这就是我所做的。了解 ORM 通常不会真正“理解”存储过程而没有更深入的魔法,因此我避免直接​​使用它,而是创建一个封装存储过程的物化视图,然后将其呈现为常规表。正确设置,这给了 ORM 一些它可以更好地理解的东西,同时仍然利用将数据库逻辑保持在它应该存在的层内的优势,数据库,一个在数据处理方面总是优于 Web 框架的引擎。

于 2016-07-08T08:11:52.963 回答
5

您可以从 Rails 调用存储过程,但您将失去 ActiveRecord 的大部分好处,因为标准生成的 SQL 将不起作用。您可以使用本地数据库连接并调用它,但这将是一个泄漏的抽象。您可能需要考虑 DataMapper。

摘自 >>在 Rails 中使用存储过程

总而言之,它不是使用存储过程的“RAILS WAY”。

于 2013-03-20T07:18:36.153 回答
4

不喜欢使用存储过程/sql函数是常见的做法吗?

真的。使用 Active Record 构建查询允许您在应用程序代码中管理它们。

使用存储过程的优缺点是什么?

优点:您可以从应用程序代码中隐藏复杂的查询逻辑。

缺点:如果要重写过程,则必须创建并执行迁移。

请参阅此示例,了解在数据库视图中隐藏逻辑,也适用于过程。

优点示例:

您需要选择所有在start_time和之间有空房的酒店end_time。每个酒店都有 total_rooms(整数属性)、hotel_times(定义酒店营业时间的实体)和一些预订(定义在酒店预订房间的用户的实体)。有些酒店很大,提供每日预订。其他酒店规模较小,按小时预订。您询问用户何时想要预订,可以是日期或日期与时间。

这涉及到一些连接和子查询,并且会创建一大段丑陋的 Active Record 代码。相反,您可以编写一个过程并像这样调用它:

Hotel.find_by_sql ['SELECT * FROM hotels_available_between(?, ?)', start_time, end_time]

将它包装在一个范围内并获得更多的 ruby​​ 风格:

class Hotel < ActiveRecord::Base
  scope :available_between, -> start_time, end_time do
    find_by_sql ['SELECT * FROM hotels_available_between(?, ?)', start_time, end_time]
  end
end

Hotel.available_between start_time, end_time
于 2016-12-30T15:09:52.013 回答