pra*_*ech 20 mysql activerecord stored-procedures ruby-on-rails
我是一个有6年经验的.net人.最近我开始研究ROR项目,并意识到存储过程/ sql函数根本没有被使用.在询问它时,我知道这是常见的做法,一般来说团队中没有人写一个SQL查询,一切都是使用ActiveRecord完成的.
我搜索了任何可能的原因,但没有找到太多信息.所以我只是好奇才知道
mea*_*gar 29
通常的做法是不希望使用存储过程/ sql函数吗?
这是很常见的,大多数Rails应用程序永远不需要使用ActiveRecord以外的任何东西.
一个落后的Rails的主要理念是,它得到一个更重要的工作产品推向市场今天比它是从现在得到一个"快"的产品推向市场6个月.您的产品几乎肯定不会受到足够的欢迎,因此性能成为一个问题.如果这确实成为一个问题,您可以在以后支持性能方面,但最关心的是能够快速构建应用程序,并能够快速重构部分或全部应用程序以响应您的市场.
使用存储过程的优缺点是什么?
它们编写速度较慢,更难以更改,因此会降低开发成本.但是,它们可以更快地执行.
它可能不是使用存储过程的"轨道方式",但它也不是使用外键代价的"轨道方式",而且我们都知道结果是一个非常糟糕的设计决策.
所以我会用一粒盐"走铁路".如果存储过程适合您,请使用它们.
您可以从Rails调用存储过程,但是您将失去ActiveRecord的大部分好处,因为标准生成的SQL将无法工作.您可以使用本机数据库连接并调用它,但它将是一个漏洞的抽象.您可能需要考虑DataMapper.
取自>> 在Rails中使用存储过程
综上所述,它不是使用存储过程的"RAILS WAY".
不首选使用存储过程/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)