class RewardExperienceService attr_reader :user, :attrs def initialize(user, **attrs) @user = user @attrs = attrs.slice(*%i[container_id container_type score]) end def call return if user.experiences.exists?(attrs.except(:score)) ActiveRecord::Base.transaction do experience = user.experiences.create!(attrs) user.increment!(:experience, experience.score) experience end end def self.call(user, **attrs) new(user, attrs).call end end