You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/app/services/ecs/save_graduation_requirement...

70 lines
2.2 KiB

class Ecs::SaveGraduationRequirementeService < ApplicationService
include AcceptsNestedAttributesHelper
attr_reader :ec_year, :graduation_requirement, :params
def initialize(graduation_requirement, params)
@graduation_requirement = graduation_requirement
@ec_year = graduation_requirement.ec_year
@params = params
end
def call
set_graduation_subitems_position!
graduation_requirement.position = params[:position].presence || ec_year.ec_graduation_requirements.count + 1
graduation_requirement.content = params[:content].to_s.strip
attributes = build_accepts_nested_attributes(
graduation_requirement,
graduation_requirement.ec_graduation_subitems,
params[:graduation_subitems],
&method(:graduation_subitem_params_handler!)
)
ActiveRecord::Base.transaction do
graduation_requirement.assign_attributes(ec_graduation_subitems_attributes: attributes)
resort_graduation_requirements_position!
graduation_requirement.save!
end
graduation_requirement
end
private
def set_graduation_subitems_position!
params[:graduation_subitems].each_with_index do |item, index|
item[:position] = index + 1
end
end
def resort_graduation_requirements_position!
# 新增时
if graduation_requirement.new_record?
# 插入数据时只需要后移
ec_year.ec_graduation_requirements.where('position >= ?', graduation_requirement.position)
.update_all('position = position + 1')
return
end
# 编辑时
new_position = graduation_requirement.position
old_position = graduation_requirement.position_in_database
if new_position > old_position # 前移
ec_year.ec_graduation_requirements.where('position <= ? AND position > ?', new_position, old_position)
.update_all('position = position - 1')
elsif new_position < old_position # 后移
ec_year.ec_graduation_requirements.where('position >= ? AND position < ?', new_position, old_position)
.update_all('position = position + 1')
end
end
def graduation_subitem_params_handler!(subitem)
subitem[:content] = subitem[:content].to_s.strip
end
end