выпуск записей базы данных рельсов - PullRequest
0 голосов
/ 06 июня 2018

Это мой метод запроса в файле модели:

def self.sum_by_brand_category
  result = Product.joins(:brand, :category)
           .select("brands.id as brand_id, categories.id as category_id, sum(products.quantity) as count")
           .group("brands.id, categories.id")
  return result
end

Вот пример результата запроса базы данных, который я получаю:

[
  {
    "id":null,
    "brand_id":43,
    "category_id":1,
    "count":2
  },
  {
    "id":null,
    "brand_id":43,
    "category_id":2,
    "count":5
  },
  {
    "id":null,
    "brand_id":43,
    "category_id":3,
    "count":4
  },
  ....
]

Я ожидаю, что будет использован окончательный результат JSONво взглядах должно быть так:

[
  {
    "id":null,
    "brand_id":43,
    "quantity": [
      {
        "category_id": 1,
        "count": 2
      },
      {
        "category_id": 2,
        "count": 5
      },
      {
        "category_id": 3,
        "count": 4
      }
    ]
  },
  ....
]

Как мне этого добиться?Изменить метод модели?Восстановить результат в контроллере перед отправкой в ​​представление?и как?

Любые предложения будут оценены.Спасибо.


Обновлено :

Основываясь на ответе @cmrichards, я придумала этот закрытый метод, который вызывается в контроллере, а затем используется в представлениях.Я включаю здесь свою работу, хотя это не СУХИЕ коды:

private
  def get_sum_by_brand_category
    query_results = Product.sum_by_brand_category

    results = []

    query_results.group_by(&:brand_id).each do |brand_id, query_result|
      result = {}
      result[:id] = nil
      result[:brand_id] = brand_id
      quantity_array = []
      query_result.each do |data|
        quantity_block = {}
        quantity_block[:category_id] = data.category_id
        quantity_block[:count] = data.count
        quantity_array.push(quantity_block)
      end
      result[:quantity] = quantity_array

      results.push(result)
    end

    return results
  end

Пожалуйста, СУШИТЕ их, если хотите, отредактировав мой вопрос.;)

1 Ответ

0 голосов
/ 06 июня 2018

Один из вариантов - использовать jBuilder, популярный гем, поддерживаемый командой Rails, который предоставляет простой DSL (предметно-ориентированный язык), позволяющий вам определять структуры JSON в ваших представлениях.

https://github.com/rails/jbuilder

Используя ваш существующий метод, вы можете сделать это следующим образом

контроллер

def index
    @data = Product.sum_by_brand_category    
end

views / products / index.json.jbuilder

json.array! @data.group_by(&:brand_id) do |grouped|
  brand_id, category_data = grouped
  json.id nil
  json.brand_id brand_id
  json.quantity category_data, :category_id, :count
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...