class Users::AttendanceService < ApplicationService Error = Class.new(StandardError) attr_reader :user def initialize(user) @user = user end def call nearly_attendance = Attendance.find_by(user_id: user.id) raise Error, '您已签到过了' if nearly_attendance&.today? attendance = nil ActiveRecord::Base.transaction do gold = nearly_attendance&.next_gold || 50 user.increment!(:grade, gold) attendance = user.attendances.create!(score: gold) Grade.create!(user_id: user.id, score: gold, container_id: user.id, container_type: 'Attendance') end attendance end end