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

imwildcat · March 14, 2018 · Last by msg7086 replied at March 16, 2018 · 1458 hits

举个例子,项目有三个 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 的查询语句怎么写的?

Reply to adamshen

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

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

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

Reply to lingceng

感谢!我尝试一下!

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

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

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

You need to Sign in before reply, if you don't have an account, please Sign up first.