我只是想知道以下是否可行:我有嵌套关联模型的模型。我希望能够render json:
current_user.reports.minned
并eager_load
获取每个模型的弹出值。我怎么能做到这一点?
这里我只使用2个模型作为例子。实际上,该解决方案需要适用于n + 1个嵌套模型。
不起作用:
class Report
has_many :templates
def minned
self.pluck(:id, :title)
self.templates = templates.minned
end
end
class Template
belongs_to :report
def minned
self.pluck(:id, :name, :sections, :columns)
end
end
....
# reports.minned.limit(limit).offset(offset)
# This should return something like:
[{
'id': 0,
'title': 'Rep',
'templates': [{
'id': 0,
'name': 'Temp'
'sections': [],
'columns': []
}]
},
{
'id': 1,
'title': 'Rep 1',
'templates': [{
'id': 0,
'name': 'Temp',
'sections': [],
'columns': []
},
{
'id': 1,
'name': 'Temp 1',
'sections': [],
'columns': []
}]
}]
感谢您的帮助。
修改
我将补充一点,我通过覆盖每个模型的as_json
找到了一种方法,但这会将所有请求应用于此。我需要控制哪些请求提供了哪些信息。
# in Report model
def as_json(options={})
super(:id, :title).merge(templates: templates)
end
# in Template model
def as_json(options={})
super(:id, :name, :sections, :columns)
end
感谢eirikir,这就是我需要做的一切:
def self.minned
includes(:templates).as_json(only: [:id, :title], include: {templates: {only: [:id, :name, :sections, :columns]}})
end
然后当使用分页顺序,限制或类似的东西时,只需将其放在最后:
paginate pre_paginated_reports.count, max_per_page do |limit, offset|
render json: pre_paginated_reports.order(id: :desc).limit(limit).offset(offset).minned
end
现在我不会覆盖as_json
并完全控制我收到的数据。
答案 0 :(得分:1)
如果我理解正确,您应该能够在as_json
给出的选项中指定输出:
current_user.reports.includes(:templates).as_json(only: [:id, :title], include: {templates: {only: [:id, :name, :sections, :columns]}})