Доброго времени суток.
Я разрабатываю приложение на RoR, и делаю это в одиночку. Ментора так и не нашел.
Хотел бы попросить вас помочь в части критики кода, т.к. спросить не у кого.
Чтобы лучше понять что вообще код делает можно посмотреть вот эту страницу:
https://skyderby.ru/ru/tracks/2795/replay
В общем - есть GPS трек полета, нужно на его оценить по параметрам лучшая дальность за 1000 метров высоты, лучшая скорость за 1000 метров высоты, лучшее время за 1000 метров высоты. При этом, если полета в треке меньше чем 1000 метров или это полет со скал (base jumping) то нужно рассчитать результаты за весь диапазон.
Для этих целей я разработал сервис объект:
class TrackResultsService
attr_reader :track
STEP_SIZE = 50
SKYDIVE_RANGE = 1000
def initialize(trk)
@track = trk
end
def execute
track.destroy_results
results = ranges_to_score.map do |range|
{ range: range,
track_segment: JumpRangeFinder.new(track_points)
.execute(from_altitude: range[:start_altitude],
to_altitude: range[:end_altitude])
}
end
[:speed, :distance, :time].each do |task|
best_task_result = results.max_by { |x| x[:track_segment][task] }
track.track_result << TrackResult.new(discipline: task,
range_from: range[:start_altitude],
range_to: range[:end_altitude],
result: best_task_result)
end
end
def track_points
@track_points ||=
track.points.trimmed.pluck_to_hash(
'to_timestamp(gps_time_in_seconds) AT TIME ZONE \'UTC\' as gps_time',
"#{@track.point_altitude_field} AS altitude",
:latitude,
:longitude)
end
def ranges_to_score
altitude_bounds = track.altitude_bounds
# round to STEP_SIZE. Max to lower, min to upper value
max_altitude = altitude_bounds[:max_altitude] - altitude_bounds[:max_altitude] % STEP_SIZE
min_altitude = altitude_bounds[:min_altitude] + STEP_SIZE - altitude_bounds[:min_altitude] % STEP_SIZE
elevation = max_altitude - min_altitude
return [{
start_altitude: altitude_bounds[:max_altitude],
end_altitude: altitude_bounds[:min_altitude]
}] if track.base? || elevation <= SKYDIVE_RANGE
ranges = []
steps = ((elevation - SKYDIVE_RANGE) / STEP_SIZE).floor
steps.times do |step|
altitude_change = STEP_SIZE * step
ranges << {
start_altitude: altitude_bounds[:max_altitude] - altitude_change,
end_altitude: altitude_bounds[:max_altitude] - SKYDIVE_RANGE - altitude_change
}
end
ranges
end
end
Дайте, пожалуйста, какой-либо фидбек.