Как правильно создать запрос для выбора всей вложенной информации с помощью Pundit? - PullRequest
0 голосов
/ 27 марта 2020

Я использую приложение rails api. В моем приложении есть модели Оценка, Категория, Подкатегория, Этапы, ПодкатегорияПрогресс. Мне нужно, чтобы вся информация об одной категории включала все подкатегории и их этапы для current_user (это может быть текущий пользовательский режим) (в действии show / Categories_controller.rb). И со всей информацией мне нужно вывести позицию, которая является текущим этапом sub_categories (запись модели SubCategoryProgress). Я сделал это, но это очень плохое решение, и я не могу получить информацию о категории, я получаю только подкатегории и этапы с current_stage.

app / models / category.rb

class Category < ApplicationRecord
  belongs_to :assessment
  has_many :sub_categories, dependent: :destroy

  scope :current_assessment, ->(assessment_id) {
    where(assessment_id: assessment_id)
  }

  def sub_category_status(user_id)
    sub_categories.map do |sub_category|
      sub_category.sub_category_progresses.where("sub_category_progresses.customer_id = ?", user_id).map do |progress|
    {
      sub_category: sub_category,
      stages: sub_category.stages,
      current_stage_id: progress.current_stage_id
    }
   end
  end
 end
end

app / models / sub_category.rb

class SubCategory < ApplicationRecord
  belongs_to :category
  has_many :stages, dependent: :destroy
  has_many :sub_category_progresses, dependent: :destroy
end

app / models / stage.rb

class Stage < ApplicationRecord
  belongs_to :sub_category
  has_many :tasks, dependent: :destroy

  validates :position, uniqueness: { scope: :sub_category_id, message: "should be uniq for one sub_category" }
end

app / models / sub_category_progress.rb

class SubCategoryProgress < ApplicationRecord
  belongs_to :customer
  belongs_to :sub_category

  validates :customer_id, uniqueness: { scope: :sub_category_id }
  validate :correct_values_for_current_stage_id
end

app / controllers / Categories_controller.rb

class CategoriesController < ApplicationController
  before_action :set_assessment
  before_action :set_category, only: :show

  def show
    render json: @category.sub_category_status(current_user.id)
  end

  private

  def set_category
    @category = policy_scope(Category).current_assessment(@assessment.id).find(params[:id])
  end

  def set_assessment
    @assessment = Assessment.find(params[:assessment_id])
  end
end
...