

現在、生後何ヶ月かによって、幼児の体重を取得するといったコードを書いているのですが、数ヶ月とおきといった際に、以下のように、where文を複数記述しています。実際は、each
で回して処理を行なっているのですが、発行される SQL は同一です。  
index
を貼ったのですが、このように冗長なコードよりもっと綺麗な書き方があると思ったのですが、なかなかうまく書けず。綺麗にかけるよというアドバイスありましたら、是非教えていただきたいです。

またindex以外にパフォーマンスを保てる方法がありましたら、是非教えていただきたいです。よろしくお願いいたします。

rubyコード

[code]

    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
    
[/code]

SQL

[code]

    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
    
[/code]


CC BY-SA 3.0
2017-08-19T16:37:50.573
37344
2017-08-19T19:43:22.457
2017-08-19T19:43:22.457
4715
24954
question
ruby-on-rails ruby mysql
where文を使用したSQLの効率化