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.
58 lines
2.0 KiB
58 lines
2.0 KiB
class ItemBanks::SaveItemService < ApplicationService
|
|
attr_reader :item, :params
|
|
|
|
def initialize(item, params)
|
|
@item = item
|
|
@params = params
|
|
end
|
|
|
|
def call
|
|
new_record = item.new_record?
|
|
raise("不能更改题型") if !new_record && item.item_type != params[:item_type]
|
|
ItemBanks::SaveItemForm.new(params).validate!
|
|
|
|
ActiveRecord::Base.transaction do
|
|
item.item_type = params[:item_type] if new_record
|
|
item.difficulty = params[:difficulty]
|
|
item.sub_discipline_id = params[:sub_discipline_id]
|
|
item.name = params[:name].to_s.strip
|
|
item.save!
|
|
|
|
analysis = item.item_analysis || ItemAnalysis.new(item_bank_id: item.id)
|
|
analysis.analysis = params[:analysis].blank? ? nil : params[:analysis].strip
|
|
analysis.save
|
|
|
|
# 知识点的创建
|
|
new_tag_discipline_ids = params[:tag_discipline_id]
|
|
old_tag_discipline_ids = item.tag_discipline_containers.pluck(:tag_discipline_id)
|
|
delete_tag_discipline_ids = old_tag_discipline_ids - new_tag_discipline_ids
|
|
create_tag_discipline_ids = new_tag_discipline_ids - old_tag_discipline_ids
|
|
item.tag_discipline_containers.where(tag_discipline_id: delete_tag_discipline_ids).destroy_all
|
|
create_tag_discipline_ids.each do |tag_id|
|
|
item.tag_discipline_containers << TagDisciplineContainer.new(tag_discipline_id: tag_id)
|
|
end
|
|
|
|
# 选项的创建
|
|
if %W(SINGLE MULTIPLE JUDGMENT).include?(item.item_type)
|
|
old_choices = item.item_choices
|
|
new_choices = params[:choices]
|
|
|
|
new_choices.each_with_index do |choice, index|
|
|
choice_item = old_choices[index] || ItemChoice.new(item_bank_id: item.id)
|
|
choice_item.choice_text = choice[:choice_text]
|
|
choice_item.is_answer = choice[:is_answer]
|
|
choice_item.save!
|
|
end
|
|
|
|
if old_choices.length > new_choices.length
|
|
old_choices[new_choices.length..(old_choices.length-1)].each do |old_choice|
|
|
old_choice.destroy
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
item
|
|
end
|
|
end |