where文を使用したSQLの効率化
現在、生後何ヶ月かによって、幼児の体重を取得するといったコードを書いているのですが、数ヶ月とおきといった際に、以下のように、where文を複数記述しています。実際は、each で回して処理を行なっているのですが、発行される SQL は同一です。
index を貼ったのですが、このように冗長なコードよりもっと綺麗な書き方があると思ったのですが、なかなかうまく書けず。綺麗にかけるよというアドバイスありましたら、是非教えていただきたいです。
またindex以外にパフォーマンスを保てる方法がありましたら、是非教えていただきたいです。よろしくお願いいたします。
rubyコード
body_measurement_1 = body_measurements.where(measuring_date_on: "#{@student.birthday >> 0}".."#{@student.birthday >> 1}")&.last
body_measurement_2 = body_measurements.where(measuring_date_on: "#{@student.birthday >> 1}".."#{@student.birthday >> 2}")&.last
body_measurement_3 = body_measurements.where(measuring_date_on: "#{@student.birthday >> 2}".."#{@student.birthday >> 3}")&.last
body_measurement_4 = body_measurements.where(measuring_date_on: "#{@student.birthday >> 3}".."#{@student.birthday >> 4}")&.last
body_measurement_5 = body_measurements.where(measuring_date_on: "#{@student.birthday >> 4}".."#{@student.birthday >> 5}")&.last
body_measurement_6 = body_measurements.where(measuring_date_on: "#{@student.birthday >> 5}".."#{@student.birthday >> 6}")&.last
SQL
BodyMeasurement Load (1.1ms) SELECT `body_measurements`.* FROM `body_measurements` WHERE `body_measurements`.`student_id` = 5 AND (`body_measurements`.`measuring_date_on` BETWEEN '2012-12-19' AND '2013-01-19') ORDER BY `body_measurements`.`id` DESC LIMIT 1
BodyMeasurement Load (0.9ms) SELECT `body_measurements`.* FROM `body_measurements` WHERE `body_measurements`.`student_id` = 5 AND (`body_measurements`.`measuring_date_on` BETWEEN '2013-01-19' AND '2013-02-19') ORDER BY `body_measurements`.`id` DESC LIMIT 1
BodyMeasurement Load (1.1ms) SELECT `body_measurements`.* FROM `body_measurements` WHERE `body_measurements`.`student_id` = 5 AND (`body_measurements`.`measuring_date_on` BETWEEN '2013-02-19' AND '2013-03-19') ORDER BY `body_measurements`.`id` DESC LIMIT 1
BodyMeasurement Load (1.2ms) SELECT `body_measurements`.* FROM `body_measurements` WHERE `body_measurements`.`student_id` = 5 AND (`body_measurements`.`measuring_date_on` BETWEEN '2013-03-19' AND '2013-04-19') ORDER BY `body_measurements`.`id` DESC LIMIT 1
BodyMeasurement Load (1.3ms) SELECT `body_measurements`.* FROM `body_measurements` WHERE `body_measurements`.`student_id` = 5 AND (`body_measurements`.`measuring_date_on` BETWEEN '2013-04-19' AND '2013-05-19') ORDER BY `body_measurements`.`id` DESC LIMIT 1
BodyMeasurement Load (1.0ms) SELECT `body_measurements`.* FROM `body_measurements` WHERE `body_measurements`.`student_id` = 5 AND (`body_measurements`.`measuring_date_on` BETWEEN '2013-05-19' AND '2013-06-19') ORDER BY `body_measurements`.`id` DESC LIMIT 1