app/models/concerns/with_assignments_batch.rb
# WithAssignmentsBatch mirrors the WithAssignment mixin
# but implements operations in batches, so that they outperform
# their counterparts
module WithAssignmentsBatch
extend ActiveSupport::Concern
def find_assignments_for(user, organization = Organization.current, &block)
block = block_given? ? block : lambda { |it, _e| it }
return exercises.map { |it| block.call nil, it } unless user
pairs = exercises.map { |it| [it.id, [nil, it]] }.to_h
Assignment.where(submitter: user, organization: organization, exercise: exercises).each do |it|
pairs[it.exercise_id][0] = it
end
pairs.values.map { |assignment, exercise| block.call assignment, exercise }
end
def statuses_for(user, organization = Organization.current)
find_assignments_for user, organization do |it|
it&.status || Mumuki::Domain::Status::Submission::Pending
end
end
def assignments_for(user, organization = Organization.current)
find_assignments_for user, organization do |it, exercise|
it || Assignment.build_for(user, exercise, organization)
end
end
end