为什么使用ActiveRecord而不是MySql API

时间:2020-03-06 15:00:44  来源:igfitidea点击:

我开发Web应用程序已有一段时间了,我对mySql非常满意,实际上我几乎每天都使用某种形式的SQL。我喜欢语法,并且在编写查询或者优化表方面零问题。我喜欢这个mysql API。

困扰我的是Ruby on Rails使用ActiveRecord并迁移所有内容,因此我们可以使用函数来查询数据库。我想这个想法是我们"不必再考虑SQL"。也许这不是KISS(保持简单愚蠢),但是ActiveRecord接口真的是最好的吗?如果可以,为什么?

无需编写SQL语句就能进行开发吗?如果我们不得不查找尚未定义为rails函数的内容怎么办?我知道它们具有允许我执行自定义查询的功能。我想我真的想知道人们认为使用ActiveRecord优于mySQL有什么好处,如果有人觉得像我,这可能对Rails社区而言,计算器对数学社区而言,有些人可能会忘记如何做长时间分配。

解决方案

这里的想法是,通过将数据库逻辑放入活动记录中,我们可以在一个地方处理SQL代码,而不是遍及整个应用程序。这使应用程序的各个层更容易遵循"单一职责原则"(对象应该只有一个更改理由)。

这是有关活动记录模式的文章。

当我们决定更改数据库方案时,避免使用SQL会对我们有所帮助。对于诸如验证之类的所有事物,抽象也是必需的。我并不是说我们不必编写SQL:如果有需要,可以随时这样做。但是我们不必编写5行查询,而只需要user.save。避免不必要的代码是Rails的理念。

没错,将SQL隐藏在ActiveRecord的层后面意味着人们可能会忘记检查生成的SQL。我自己对此一直感到bit:缺少索引,效率低下的查询等。

ActiveRecord允许的是使简单的事情变得容易:

Post.find(1)

SELECT * FROM posts WHERE posts.id = 1

我们(开发人员)的打字次数更少,因此出错的机会也更少。

验证是ActiveRecord简化的另一件事。无论如何,我们都必须这样做,那么为什么不拥有一种简单的方法呢?重复的,无聊的部分被抽象出来了吗?

class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_length_of :title, :maximum => 80
end

if params[:post][:title].blank? then
  # complain
elsif params[:post][:title].length > 80 then
  # complain again
end

再次,易于指定,易于验证。是否需要更多验证?要添加到ActiveRecord模型的一行。具有多种条件的卷积代码始终很难调试和测试。为什么不对我们轻松呢?

我真正喜欢ActiveRecord而不是SQL的最后一件事是回调。回调可以使用SQL触发器(仅在MySQL 5.0或者更高版本中可用)进行模拟,而ActiveRecord自那时起就具有回调(我从0.13开始)。

总结一下:

  • ActiveRecord使简单的事情变得容易。
  • ActiveRecord删除了无聊的重复部分;
  • ActiveRecord不会阻止我们编写自己的SQL(通常出于性能原因),最后;
  • ActiveRecord可以在大多数数据库引擎中完全移植,而SQL本身不是(有时)。

我知道在情况下,我们是在专门谈论MySQL,但仍然如此。有选择是不错的。