查询具有多个plucks的嵌套模型

时间:2015-08-07 22:47:22

标签: ruby-on-rails

我只是想知道以下是否可行:我有嵌套关联模型的模型。我希望能够render json: current_user.reports.minnedeager_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并完全控制我收到的数据。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您应该能够在as_json给出的选项中指定输出:

current_user.reports.includes(:templates).as_json(only: [:id, :title], include: {templates: {only: [:id, :name, :sections, :columns]}})