sql - 如何在 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 方式吗?
解决方案
你基本上已经搞定了!通过为 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 方式的重要组成部分
...我从事过一个特定的数据库繁重的项目,其中直接的数据库连接(例如上面的)对于速度至关重要。
推荐阅读
- javascript - 无法提交消息:路径不是合法形式
- javascript - 每个元素的输入数字对象
- azure - 如何使用 Azure Rest API 在 azure 门户中的诊断设置列表下获取资源的诊断状态?状态如下:启用/禁用
- python - 布尔索引与维度 0 上的索引数组不匹配;维度为 2,但对应的布尔维度为 18
- rabbitmq - 如何查询rabbitmq_exporter
- websocket - 如何在 WebSocket 中代理到多个服务器
- flutter - 允许小部件溢出
- java - SmsManager 在发送每条短信之间有延迟
- image - 上传后在编辑器中插入图片
- go - 执行 golang syscall.MProtect 时导致权限被拒绝