Ruby on Rails中的存储过程

pra*_*ech 20 mysql activerecord stored-procedures ruby-on-rails

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

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

  1. 通常的做法是不希望使用存储过程/ sql函数吗?
  2. 使用存储过程的优缺点是什么?

mea*_*gar 29

通常的做法是不希望使用存储过程/ sql函数吗?

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

一个落后的Rails的主要理念是,它得到一个更重要的工作产品推向市场今天比它是从现在得到一个"快"的产品推向市场6个月.您的产品几乎肯定不会受到足够的欢迎,因此性能成为一个问题.如果这确实成为一个问题,您可以在以后支持性能方面,但最关心的是能够快速构建应用程序,并能够快速重构部分或全部应用程序以响应您的市场.

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

它们编写速度较慢,更难以更改,因此会降低开发成本.但是,它们可以更快地执行.

  • 我意识到这个帖子是4年零1天,但存储过程"写入速度慢,更难以改变"是一个完全谬误.当然,我遇到了这个帖子,因为我也是一个.Net的家伙,不得不在rails网站上更新一个非常古老的红宝石.我的假设是存储过程在DB中而不在Rails中.如果它在Rails中,那么我会让步并说你可能是正确的.但是DB中的SP就像它一样容易. (3认同)
  • 现在已经过去6年了,变化也很大。但要加2分钱。如果您在后端使用 Rails 之外的技术,同时又不是 Rails 的技术,那么将逻辑放在存储过程或触发器中将是集中逻辑的好方法。 (2认同)

Sha*_*yne 6

它可能不是使用存储过程的"轨道方式",但它也不是使用外键代价的"轨道方式",而且我们都知道结果是一个非常糟糕的设计决策.

所以我会用一粒盐"走铁路".如果存储过程适合您,请使用它们.


az7*_*7ar 5

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

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

综上所述,它不是使用存储过程的"RAILS WAY".


Joã*_*uza 5

不首选使用存储过程/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]
Run Code Online (Sandbox Code Playgroud)

将其包裹在示波器中并获得更多红宝石风格:

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
Run Code Online (Sandbox Code Playgroud)