我有一些场景,我希望通过急切加载尽可能少地调用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
答案 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视图文件的版本。