通过使用join避免rails使用json include语句进行额外查询

时间:2017-05-11 00:35:00

标签: ruby-on-rails activerecord

目前我正在收到25篇最新帖子

posts = Post.where(public: true).limit(25).order(created_at: :desc)

当我渲染它时,我使用了包含

render :json => posts.as_json(:include => [:user])

这是为了让发帖的用户发送它,即:

{
      "id": 43,
      "title": "asdfasdfs",
      "story": "adfaf sdf sd asdf sdf asdf saf adf",
      "created_at": "2017-05-10T22:40:54.587Z",
      "user": {
        "id": 4,
        "first_name": "heelo",
        "last_name": "heelo",
}

看起来效果很好,但在查看控制台时。它制作了26个查询,一个用于获取帖子,

 SELECT  "posts".* FROM "posts" WHERE (public = true) ORDER BY "posts"."created_at" DESC LIMIT ?  [["LIMIT", 25]]

还有25个以获取每个帖子的用户

 SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", XXX], ["LIMIT", 1]]

获取其用户。在某种程度上,我可以做一个联接,以避免再增加25个查询。我试过了

posts = Post.joins(:user).where(public: true).limit(25).order(created_at: :desc)

但似乎没有做任何事情。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

尝试使用includes将其缩减为仅两个查询。

posts = Post.includes(:user).where(public: true).limit(25).order(created_at: :desc)

这将查询一个查询中的最后25个帖子以及另一个查询中的所有关联用户。