使用带有mongoid的RABL时减少数据库调用

时间:2012-12-26 06:29:47

标签: ruby-on-rails json mongoid rabl object-object-mapping

我有一些场景,我希望通过急切加载尽可能少地调用DB,但我无法做得很好。

鉴于以下两种情况,我如何将我的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

CONTROLLER QUERY

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

1 个答案:

答案 0 :(得分: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

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