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

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

举个例子,项目有三个 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 如下(可能不够标准):

共收到 6 条回复

你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都会帮你缓存。

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