From cb8a14206c5346fda60df2ffdc8e754c63b82ffe Mon Sep 17 00:00:00 2001 From: Brian Koh Date: Wed, 15 Apr 2015 17:00:50 +0800 Subject: [PATCH 1/4] Add .exp_points to CourseUser --- app/models/course_user.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/models/course_user.rb b/app/models/course_user.rb index 9cace1717f8..d23910fc70d 100644 --- a/app/models/course_user.rb +++ b/app/models/course_user.rb @@ -5,4 +5,11 @@ class CourseUser < ActiveRecord::Base inverse_of: :course_user, dependent: :destroy enum role: { student: 0, teaching_assistant: 1, manager: 2, owner: 3 } + + # Number of Experience (EXP) Points a course_user has gained + # + # @return [Integer] Number of EXP Points + def exp_points + exp_records.map(&:exp_awarded).inject(:+) + end end From a500b4032e43bcc475862d36e9421e5a179d454c Mon Sep 17 00:00:00 2001 From: Brian Koh Date: Wed, 15 Apr 2015 17:01:20 +0800 Subject: [PATCH 2/4] Add CourseUser .exp_points test --- spec/models/course_user_spec.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/models/course_user_spec.rb b/spec/models/course_user_spec.rb index f083b2e2241..aab19570dd9 100644 --- a/spec/models/course_user_spec.rb +++ b/spec/models/course_user_spec.rb @@ -16,4 +16,19 @@ it { is_expected.to be_student } it { is_expected.not_to be_phantom } end + + let!(:instance) { create :instance } + with_tenant(:instance) do + describe '#exp_points' do + let!(:exp_record_1) { create(:course_experience_points_record) } + let!(:exp_record_2) do + create(:course_experience_points_record, course_user: exp_record_1.course_user) + end + subject { exp_record_1.course_user } + it 'sums all associated experience points records' do + points_awarded = exp_record_1.points_awarded + exp_record_2.points_awarded + expect(subject.experience_points).to eq(points_awarded) + end + end + end end From 1f81ede902dc9b8d7266b9853ba934834e7f1019 Mon Sep 17 00:00:00 2001 From: Brian Koh Date: Wed, 15 Apr 2015 17:01:44 +0800 Subject: [PATCH 3/4] Add randomisation to exp of manual_exp_record factory --- spec/factories/course_experience_points_records.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/factories/course_experience_points_records.rb b/spec/factories/course_experience_points_records.rb index 35c6e183994..68b6bebbec8 100644 --- a/spec/factories/course_experience_points_records.rb +++ b/spec/factories/course_experience_points_records.rb @@ -3,7 +3,7 @@ creator updater course_user - points_awarded 100 + points_awarded { rand(1..20) * 100 } reason 'EXP for some event' end end From 17243e28352e767f7c11127c34e8a1584740943b Mon Sep 17 00:00:00 2001 From: Joel Low Date: Tue, 12 May 2015 13:51:36 +0800 Subject: [PATCH 4/4] Implement a collection method in the database instead of reducing on the application --- app/models/course_user.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/app/models/course_user.rb b/app/models/course_user.rb index d23910fc70d..06a7d4fda00 100644 --- a/app/models/course_user.rb +++ b/app/models/course_user.rb @@ -2,14 +2,13 @@ class CourseUser < ActiveRecord::Base belongs_to :user, inverse_of: :course_users belongs_to :course, inverse_of: :course_users has_many :experience_points_records, class_name: Course::ExperiencePointsRecord.name, - inverse_of: :course_user, dependent: :destroy + inverse_of: :course_user, dependent: :destroy do + def experience_points + sum(:points_awarded) + end + end enum role: { student: 0, teaching_assistant: 1, manager: 2, owner: 3 } - # Number of Experience (EXP) Points a course_user has gained - # - # @return [Integer] Number of EXP Points - def exp_points - exp_records.map(&:exp_awarded).inject(:+) - end + delegate :experience_points, to: :experience_points_records end