Я использую приложение 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