新手问题 ActiveRecord 子查询 (或者是 join) 与含有子查询的主查询缓存问题

imwildcat · 2018年03月14日 · 最后由 msg7086 回复于 2018年03月16日 · 1457 次阅读

举个例子,项目有三个 models:User, Post, UserLike,每次请求一个 PostsController#show 时,我想顺便用一条查询获取这个用户是否为这个 Post 点赞了。 如果是 raw SQL 大概是 SELECT * FROM posts WHERE posts.id = ? LEFT JOIN user_likes ON posts.id = user_likes.id LEFT JOIN users ON posts.user_id = users.id;

ActiveRecord 里有没有办法去缓存 SELECT * FROM posts WHERE posts.id = ? 这一部分,每次只查询后面的 join 部分?

ER diagram 如下(可能不够标准):

你 ar 的查询语句怎么写的?

adamshen 回复

AR 也不太会写,有什么指点吗

查询某个用户是否为文章点赞可以不用 join users,直接 join user_likes 就可以

试试不在一个 SQL 里写呢,先 posts = Post.first(5),然后每一个 post 做 post.user_likes.where(user_id: post.user_id) 这样就可以判断了。

lingceng 回复

感谢!我尝试一下!

SQL 查询是一体的,怎么可能按照 JOIN 拆开缓存?数据都不一样的。

而且 JOIN 都是数据库计算的,管 AR 啥事了。

而且要有效利用缓存的话,应该每个查询都简单点,这样别说 AR,连 MySQL 都会帮你缓存。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号