yslnewtiku
parent
02b6646bd2
commit
c564e68a97
@ -0,0 +1,30 @@
|
||||
class ItemBasketsController < ApplicationController
|
||||
before_action :require_login
|
||||
|
||||
def index
|
||||
|
||||
end
|
||||
|
||||
def create
|
||||
ItemBaskets::SaveItemBasketService.call(current_user, create_params)
|
||||
end
|
||||
|
||||
def destroy
|
||||
item = current_user.item_baskets.find_by!(item_bank_id: params[:id])
|
||||
ActiveRecord::Base.transaction do
|
||||
current_user.item_baskets.where("item_type = #{item.item_type} and position > #{item.position}").update_all("position = position -1")
|
||||
item.destroy!
|
||||
end
|
||||
render_ok
|
||||
end
|
||||
|
||||
def delete_item_type
|
||||
# tip_exception() unless
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def create_params
|
||||
params.permit(item_ids: [])
|
||||
end
|
||||
end
|
@ -1,13 +1,33 @@
|
||||
class ItemBank::SaveItemForm
|
||||
class ItemBanks::SaveItemForm
|
||||
include ActiveModel::Model
|
||||
|
||||
attr_accessor :repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, :tag_repertoire_id, :choices
|
||||
attr_accessor :repertoire_id, :sub_repertoire_id, :item_type, :difficulty, :name, :analysis, :tag_repertoire_id, :choices
|
||||
|
||||
validates :repertoire_id, presence: true
|
||||
validates :sub_repertoire_id, presence: true
|
||||
validates :item_type, presence: true
|
||||
validates :difficulty, presence: true
|
||||
validates :name, presence: true
|
||||
validates :item_type, presence: true, inclusion: {in: 0..6}, numericality: { only_integer: true }
|
||||
validates :difficulty, presence: true, inclusion: {in: 1..3}, numericality: { only_integer: true }
|
||||
validates :name, presence: true, length: { maximum: 1000 }
|
||||
validates :analysis, length: { maximum: 1000 }
|
||||
|
||||
def validate!
|
||||
super
|
||||
return unless errors.blank?
|
||||
choices.each { |item| SubForm.new(item).validate! } if item_type < 3
|
||||
return unless errors.blank?
|
||||
if [0, 2].include?(item_type) && choices.pluck(:is_answer).select{|item| item == 1}.length > 1
|
||||
raise("正确答案只能有一个")
|
||||
elsif item_type == 1 && choices.pluck(:is_answer).select{|item| item == 1}.length <= 1
|
||||
raise("多选题至少有两个正确答案")
|
||||
end
|
||||
end
|
||||
|
||||
class SubForm
|
||||
include ActiveModel::Model
|
||||
|
||||
attr_accessor :choice_text, :is_answer
|
||||
|
||||
validates :choice_text, presence: true, length: { maximum: 100 }
|
||||
validates :is_answer, presence: true, inclusion: {in: 0..1}, numericality: { only_integer: true }
|
||||
end
|
||||
end
|
@ -0,0 +1,47 @@
|
||||
class ItemBaskets::SaveItemBasketService < ApplicationService
|
||||
attr_reader :user, :params
|
||||
|
||||
def initialize(user, params)
|
||||
@user = user
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
raise("请选择试题") if params[:item_ids].blank?
|
||||
|
||||
# 只能选用公共题库或是自己的题库
|
||||
items = ItemBank.where(public: 1).or(ItemBank.where(user_id: user.id))
|
||||
|
||||
# 已选到过试题篮的不重复选用
|
||||
item_ids = params[:item_ids] - user.item_baskets.pluck(:item_bank_id)
|
||||
items.where(id: item_ids).each do |item|
|
||||
new_item = ItemBasket.new(user_id: user.id, item_bank_id: item.id, item_type: item.item_type)
|
||||
new_item.score = item_score item.item_type
|
||||
new_item.position = item_position item.item_type
|
||||
new_item.save!
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def item_score item_type
|
||||
if user.item_baskets.where(item_type: item_type).last.present?
|
||||
score = user.item_baskets.where(item_type: item_type).last.score
|
||||
else
|
||||
score =
|
||||
case item_type
|
||||
when 0, 1, 2
|
||||
5
|
||||
when 6
|
||||
10
|
||||
else
|
||||
5
|
||||
end
|
||||
end
|
||||
score
|
||||
end
|
||||
|
||||
def item_position item_type
|
||||
user.item_baskets.where(item_type: item_type).last&.position.to_i + 1
|
||||
end
|
||||
end
|
@ -0,0 +1,15 @@
|
||||
json.repertoire do
|
||||
json.(@item.sub_repertoire&.repertoire, :id, :name)
|
||||
end
|
||||
json.sub_repertoire do
|
||||
json.(@item.sub_repertoire, :id, :name)
|
||||
end
|
||||
json.tag_repertoires @item.tag_repertoires do |tag|
|
||||
json.(tag, :id, :name)
|
||||
end
|
||||
json.(@item, :id, :name, :item_type, :difficulty)
|
||||
json.analysis @item.analysis
|
||||
json.choices @item.item_choices do |choice|
|
||||
json.choice_text choice.choice_text
|
||||
json.is_answer choice.is_answer
|
||||
end
|
@ -0,0 +1,7 @@
|
||||
class AddPositionScoreToBasket < ActiveRecord::Migration[5.2]
|
||||
def change
|
||||
add_column :item_baskets, :position, :integer, default: 0
|
||||
add_column :item_baskets, :score, :float, default: 0
|
||||
add_column :item_baskets, :item_type, :integer, default: 0
|
||||
end
|
||||
end
|
Loading…
Reference in new issue