Намаляване на DB извикванията при използване на RABL с mongoid

Имам няколко сценария, при които бих искал да направя възможно най-малко извиквания на DB чрез нетърпеливо зареждане, но не успях да го направя добре.

Предвид двата сценария по-долу, как мога да променя моя RABL, за да извършвам възможно най-малко разговори?


МОДЕЛ НА ОБЕКТ:

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

RABL (И двете ще накарат DB да извършва много индивидуални повиквания)

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)...

ПОСТ.РБ

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

person ming yeow    schedule 26.12.2012    source източник
comment
имате ли регистрационни файлове за това колко заявки се случват?   -  person Arthur Neves    schedule 29.12.2012
comment
Как предавате потребителя на метода filtered_comments, ако той не приема нито един?   -  person Ismael    schedule 31.12.2012


Отговори (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

Това поправи моята версия на файловете за чатлив изглед.

person ekampp    schedule 29.12.2012