Ruby on Rails中的存储过程

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

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

  1. 通常的做法是不首选使用存储过程/ sql函数吗?
  2. 使用存储过程有哪些优缺点?

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

这是非常常见的,大多数Rails应用程序永远不需要使用比ActiveRecord更多的东西。

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

使用存储过程有哪些优缺点?

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

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

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

综上所述,它不是使用存储过程的“RAILS WAY”。

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

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

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

真正。 使用Active Record构建查询允许您在应用程序代码中管理所有查询。

使用存储过程有哪些优缺点?

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

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

有关在数据库视图中隐藏逻辑的示例,请参见此示例,也适用于过程。

优点示例:

您需要选择所有在start_timeend_time之间提供客房的酒店。 每家酒店都有total_rooms(整数属性),hotel_times(定义酒店营业时间的实体)和一些预订(定义在酒店预订房间的用户的实体)。 有些酒店很大,提供每日预订。 其他酒店很小,提供每小时预订。 您询问用户何时要预订,可以是日期,也可以是日期。

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

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

将它包裹在范围内并获得更多ruby-ish:

 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