首页 > 解决方案 > 如何在 Rails 中正确编写 SQL 查询

问题描述

我有一个包含两个表的数据库: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 方式吗?

标签: sqlruby-on-railsrubysqlite

解决方案


你基本上已经搞定了!通过为 SQL 查询使用变量使其更易于回收,如下所示:

def self.get_users_and_posts
  sql = ("
     SELECT
       users.name, users.email, posts.title, posts.body
     FROM
       users
     INNER JOIN
       posts
     ON
       users.id = posts.user_id")
  result_array = ActiveRecord::Base.connection.execute(sql)
end

result_array是您的 SQL 查询在数组中的返回结果,然后您可以对其进行迭代。

它是在 Ruby 中编写原始 SQL 查询的正确方法吗?是的。正如Rails Way中指出的那样:

可以直接使用 ActiveRecord 的底层数据库连接,有时从自定义脚本和一次性或临时测试中这样做很有用。

虽然,Active Record 更像是“Rails 方式”......

ActiveRecord 表达了约定优于配置的理念,这是 Rails 方式的重要组成部分

...我从事过一个特定的数据库繁重的项目,其中直接的数据库连接(例如上面的)对于速度至关重要。


推荐阅读