diff --git a/db/migrate/20200109062658_create_subject_records.rb b/db/migrate/20200109062658_create_subject_records.rb index 97741fd8c..b990b8bdc 100644 --- a/db/migrate/20200109062658_create_subject_records.rb +++ b/db/migrate/20200109062658_create_subject_records.rb @@ -1,7 +1,7 @@ class CreateSubjectRecords < ActiveRecord::Migration[5.2] def change create_table :subject_records do |t| - t.references :subject, unique: true + t.references :subject t.integer :study_count, default: 0 t.integer :course_study_count, default: 0 t.integer :initiative_study, default: 0 diff --git a/db/migrate/20200111024736_add_index_for_subject_records.rb b/db/migrate/20200111024736_add_index_for_subject_records.rb new file mode 100644 index 000000000..c27c9b9ae --- /dev/null +++ b/db/migrate/20200111024736_add_index_for_subject_records.rb @@ -0,0 +1,6 @@ +class AddIndexForSubjectRecords < ActiveRecord::Migration[5.2] + def change + remove_index :subject_records, :subject_id + add_index :subject_records, :subject_id, unique: true + end +end diff --git a/lib/tasks/statistic_subject_info.rake b/lib/tasks/statistic_subject_info.rake index 04e6c1195..7eed62b3c 100644 --- a/lib/tasks/statistic_subject_info.rake +++ b/lib/tasks/statistic_subject_info.rake @@ -1,36 +1,41 @@ desc "统计实践课程的学习统计数据" namespace :subjects do + buffer_size = 1000 task data_statistic: :environment do puts("---------------------data_statistic_begin") Rails.logger.info("---------------------data_statistic_begin") subjects = Subject.where(status: 2) + str = "" + column_value = "subject_id, study_count, course_study_count, initiative_study, passed_count, course_used_count, " + + "school_used_count, created_at, updated_at" subjects.find_each do |subject| puts("---------------------data_statistic: #{subject.id}") Rails.logger.info("---------------------data_statistic: #{subject.id}") - sr = SubjectRecord.find_or_create_by!(subject_id: subject.id) + #sr = SubjectRecord.find_or_create_by!(subject_id: subject.id) data = Subjects::DataStatisticService.new(subject) study_count = data.study_count - # 总人数没有变化的话,不同课堂之类的变化了 - course_study_count = (study_count == sr.study_count ? sr.course_study_count : data.course_study_count) - passed_count = (study_count == sr.study_count ? sr.passed_count : data.passed_count) - course_used_count = (study_count == sr.study_count ? sr.course_used_count : data.course_used_count) - school_used_count = (study_count == sr.study_count ? sr.school_used_count : data.school_used_count) - unless course_study_count == sr.course_study_count && - passed_count == sr.passed_count && - course_used_count == sr.course_used_count && - school_used_count == sr.school_used_count - update_params = { - study_count: study_count, - course_study_count: course_study_count, - initiative_study: (study_count - course_study_count), - passed_count: passed_count, - course_used_count: course_used_count, - school_used_count: school_used_count - } - sr.update_attributes!(update_params) + next if study_count == 0 + course_study_count = data.course_study_count + initiative_study = study_count - course_study_count + str += ", " unless str.empty? + str += ("(#{subject.id}, #{study_count}, #{course_study_count}, #{initiative_study}, " + + "#{data.passed_count}, #{data.course_used_count}, #{data.school_used_count}, " + + "'#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}', '#{Time.now.strftime('%Y-%m-%d %H:%M:%S')}')") + buffer_size += 1 + if buffer_size == 1000 + sql = "REPLACE INTO subject_records(#{column_value}) VALUES #{str}" + puts sql + ActiveRecord::Base.connection.execute sql + str = "" + buffer_size = 0 end end + if buffer_size > 0 + sql = "REPLACE INTO subject_records(#{column_value}) VALUES #{str}" + puts sql + ActiveRecord::Base.connection.execute sql + end puts("---------------------data_statistic_end") Rails.logger.info("---------------------data_statistic_end") end