Rails5のwebアプリケーションを作成しています。
大量にあるデータをwhere句で検索して取得した後、そのデータに対し編集をかけるような処理を行なっています。
Stockテーブル
id | name | price | created_at |
---|---|---|---|
1 | amazon | 500 | 2020/1/1 0:01:00 |
2 | amazon | 501 | 2020/1/1 0:02:00 |
3 | amazon | 500 | 2020/1/1 0:03:00 |
4 | amazon | 500 | 2020/1/1 0:04:00 |
5 | amazon | 501 | 2020/1/1 0:05:00 |
6 | amazon | 502 | 2020/1/1 0:06:00 |
Usdテーブル
id | rate | created_at |
---|---|---|
1 | 100 | 2020/1/1 0:01:00 |
2 | 101 | 2020/1/1 0:02:00 |
3 | 100 | 2020/1/1 0:03:00 |
4 | 100 | 2020/1/1 0:04:00 |
5 | 101 | 2020/1/1 0:05:00 |
6 | 102 | 2020/1/1 0:06:00 |
このようなデータが大量にある時
ruby
1 2stocks = Stock.where(created_at: start...end) 3 4ary = [] 5stocks.each do |stock| 6 # ここは近いであれば値であればそこまで厳密じゃなくて良い 7 usd = Usd.where(created_at: stock.created_at - 1.hours...stock.created_at + 1.hours).limit(1) 8 ary << stock.price * usd.rate 9end
みたいなことをやる時、start...end
は狭い範囲だったら良いのですが、一年分とかになると520,000件以上になり、とても終わらない処理になります。
eachブロックの中でUsd.where
やるのも問題だとは思いますが、
まずはstocks
の数を減らしたい。
そもそも、データ自体は分単位でもってるけど、参照したいデータはそこまで厳密じゃなくてもよく、3時間毎とかでも大丈夫なので
stocks = Stock.where(created_at: xxx)
の結果
id | name | rate | created_at |
---|---|---|---|
1 | amazon | 100 | 2020/1/1 0:01:00 |
100 | amazon | 101 | 2020/1/1 3:00:00 |
200 | amazon | 100 | 2020/1/1 6:00:00 |
300 | amazon | 100 | 2020/1/1 9:00:00 |
400 | amazon | 101 | 2020/1/1 12:00:00 |
500 | amazon | 102 | 2020/1/1 15:00:00 |
こんなような感じでデータを取得したいです。
この場合、どの様にすればよいでしょうか?
回答1件
あなたの回答
tips
プレビュー