2

熱心な読み込みを介してできるだけ少ない DB 呼び出しを実行したいシナリオがいくつかありますが、うまく実行できませんでした。

以下の 2 つのシナリオを考えると、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)...

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
4

1 に答える 1

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

これにより、おしゃべりなビューファイルの私のバージョンが修正されました。

于 2012-12-29T19:57:04.903 に答える