【发布时间】:2020-05-24 14:10:48
【问题描述】:
我有一个包含两个表的数据库:users 和 posts,其中一个用户可以有很多帖子。
在某些情况下我想使用纯 SQL 而不是 ActiveRecord,因为纯 SQL 更快。
在我的 UsersController 中有一个方法 index,如下所示:
def index
@users = User.get_users_and_posts
end
此方法返回有帖子的用户并返回他们的帖子。
get_users_and_posts 方法在我的模型中实现:
class User < ApplicationRecord
...
private
def self.get_users_and_posts
ActiveRecord::Base.connection.execute("
SELECT
users.name, users.email, posts.title, posts.body
FROM
users
INNER JOIN
posts
ON
users.id = posts.user_id")
end
这是在 Rails 中编写 SQL 查询的正确方法吗?它遵循 Rails 方式吗?
【问题讨论】:
-
因为普通 SQL 更快,比什么都快?
-
"...比什么更快?"确切地。 Rails、Sequel 或手工生成的 SQL 都在 DBM 中全速运行。而且,几年前,ORM 生成的 SQL 通常效率很低,但现在它非常好。再加上 DBM 在执行之前优化查询这一事实,对于不是经验丰富的 DBA 的开发人员来说,使用 ORM 开始有很大的优势。
-
如果您避免使用 Active Record 进行手动编码,您将牺牲代码的可移植性和便利性。 Active Record 使得为许多不同的 DBM 编写语法正确的 SQL 变得非常容易,允许您在开发和生产中经常使用相同的代码,而只需更改连接字符串。尝试使用手动编码的 SQL。另外,如果将来某个时候,另一个 Rails 开发人员接管了代码的支持,他们不需要知道 SQL,他们只需要知道 Active Record,不管 DB 在什么 DBM 平台下运行。所以“它遵循 Rails 方式吗?”没有。
-
以上评论是不必要的教条。我们中的很多人都从事过数据库密集型应用程序,是的,事实上,我们有时可以(并且需要)在数据库中对某些事物建模一种非“标准”(按照 AR 标准)方式因此查询它们 使用原始 SQL 以获得 10-100 倍的性能提升。这并不是说我的 SQL 比 AR 生成的更好,而是需要以 AR 无法做到(或无法做到干净)的方式来表示某些东西。 OP 要求以正确的方式执行原始 SQL,评论者应该尊重这一点。
-
我应该补充一点,我的假设(与其他评论者不同)是这 不是 XY 问题,并且 OP 简化了他们的示例并且知道为什么手写 SQL 会更多在他们的用例中表现出色。
标签: sql ruby-on-rails ruby sqlite