# bundle exec rake sync:public_message args=149,2903 namespace :sync do task :public_message => :environment do subject_id = ENV['args'].split(",")[0] # 对应课程的id shixun_id = ENV['args'].split(",")[1] # 对应课程的id board_id = ENV['args'].split(",")[2] message_id = ENV['args'].split(",")[3] status = ENV['args'].split(",")[4] # 表示相应的期数 if status.to_i == 1 start_time = '2018-12-16' end_time = '2019-04-01' elsif status.to_i == 2 start_time = '2019-04-07' end_time = '2019-07-28' else # 这种情况是取所有的 start_time = '2015-01-01' end_time = '2022-07-28' end shixun_ids = Shixun.find_by_sql("select shixun_id from stage_shixuns where stage_id in (select id from stages where subject_id=#{subject_id}) ").map(&:shixun_id) discusses = Discuss.where(dis_id: shixun_ids).where("created_at >? and created_at :environment do subject_id = ENV['args'].split(",")[0] # 对应课程的id shixun_id = ENV['args'].split(",")[1] # 对应课程的id board_id = ENV['args'].split(",")[2] message_id = ENV['args'].split(",")[3] status = ENV['args'].split(",")[4] # 表示相应的期数 if status.to_i == 1 start_time = '2018-12-16' end_time = '2019-04-01' elsif status.to_i == 2 start_time = '2019-04-07' end_time = '2019-07-28' else # 这种情况是取所有的 start_time = '2015-01-01' end_time = '2022-07-28' end if subject_id.to_i == -1 discusses = Discuss.where("parent_id is null and dis_id=?", shixun_id) else shixun_ids = Shixun.find_by_sql("select shixun_id from stage_shixuns where stage_id in (select id from stages where subject_id=#{subject_id}) ").map(&:shixun_id) discusses = Discuss.where("parent_id is null").where(dis_id: shixun_ids) end discusses.each do |discuss| rand_created_on = random_time start_time, end_time puts discuss.id # 找到所有的子回复 replies = Discuss.where(parent_id: discuss.id) # 如果有子回复,除了创建父回复外,还需要同步子回复 new_message = Message.create!(board_id: board_id.to_i, author_id: discuss.user_id, parent_id: message_id, root_id: message_id) new_message.update_columns(created_on: rand_created_on, updated_on: rand_created_on) message_detail = MessageDetail.create!(message_id: new_message.id, content: discuss.try(:content)) message_detail.update_columns(created_at: rand_created_on, updated_at: rand_created_on) if replies.present? replies.each do |reply| puts("reply id si #{reply.id}") reply_time = random_time(start_time, end_time) while reply_time > rand_created_on reply_time = random_time(start_time, end_time) end reply_message = Message.create!(board_id: board_id.to_i, author_id: reply.user_id, parent_id: new_message.id, root_id: message_id) reply_message.update_columns(created_on: reply_time, updated_on: reply_time) reply_message_detail = MessageDetail.create!(message_id: reply_message.id, content: reply.try(:content)) reply_message_detail.update_columns(created_at: rand_created_on, updated_at: rand_created_on) end end end def min_swith(time) puts time return time < 9 ? "0#{time}" : time end def random_time(start_time, end_time) hour = (6..23).to_a.sample(1).first min = rand(60) sec = rand(60) start_time = Date.parse(start_time) end_time = Date.parse(end_time) date = (start_time..end_time).to_a.sample(1).first time = "#{date} #{min_swith(hour)}:#{min_swith(min)}:#{min_swith(sec)}" puts time time end # 子评论的时间必须小于父评论 def smaller_time(parent_time, start_time, end_time) large_time = random_time(start_time, end_time) while large_time > parent_time large_time = random_time(start_time, end_time) end large_time end end task :board_count => :environment do Course.find_each do |course| puts course.id begin messages_count = Message.find_by_sql("select count(*) as count from messages where board_id in (select id from boards where course_id=#{course.id})").first.try(:count) Board.update_column(messages_count: messages_count) rescue end end end end