为什么使用ActiveRecord而不是MySql API
我开发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,但仍然如此。有选择是不错的。