将 RABL 与 mongoid 一起使用时减少 DB 调用

Posted

技术标签:

【中文标题】将 RABL 与 mongoid 一起使用时减少 DB 调用【英文标题】:Reducing DB calls when using RABL with mongoid 【发布时间】:2012-12-11 18:53:42 【问题描述】:

在一些场景中,我想通过预先加载尽可能少地调用数据库,但我一直没能做好。

鉴于以下 2 种情况,我如何更改我的 RABL 以尽可能少地拨打电话?


对象模型:

Posts 
-> belongs_to user
-> has_many: Comments 
     -> Comment belongs_to user
-> has_many: Tags
     -> Tag belongs_to user

RABL(这两者都会导致数据库进行许多单独的调用)

node(:comments) do |p|
  p.filtered_comments(@user)
end

child :tags do
  attribute :text
  child :users do
     attribute :nickname
  end
end

控制器查询

Post.includes(user, comments, tags)...

POST.RB

def filtered_comments
    comments = self.comments.where(:blocked=>false).all
    json = Rabl::Renderer.json(comments, 'comments/list', view_path: 'app/views')
    JSON.parse(json).map do |c|
      c['comment']
    end
end

【问题讨论】:

你有关于发生了多少查询的日志吗? 如果 filtered_comments 方法不接受,你如何将用户传递给它? 【参考方案1】:

通常,控制器定义了 rabl 迭代的对象,比如@user

所以在控制器中,我通常会预先加载关系,例如权限和文章,如下所示:@user = User.find(1).includes(:permissions, :articles),并以这样的用户对象响应:respond_with @user

然后,在 rabl 文件中,我有类似的内容:

# some_file.json.rabl
object @user
child :permissions do
  attributes :name
end
node :first_article do |u|
  u.articles.first
end

这修复了我的聊天视图文件版本。

【讨论】:

以上是关于将 RABL 与 mongoid 一起使用时减少 DB 调用的主要内容,如果未能解决你的问题,请参考以下文章

将 Rails + mongoid 与嵌入式 shopify 应用程序集成时出现问题

如何将@ConfigurationProperties 与记录一起使用?

Mongoid:嵌入文档在父级构造时自动初始化

如何实现has_many:通过与Mongoid和mongodb的关系?

与 Mongoid 交易的上下文

Rails - 使用 camelize 将模型序列化为 JSON