

Ruby on rails初心者です。

Linux環境上で、railsのプログラミングをしているのですがわからないことがあり  
教えてください。  
データ（※）が定期的に蓄積されているような状況で、定期的に蓄積しているデータとは別に  
ユーザがWeb上から入力した情報で蓄積したデータを取得するようなことをしたい。  
（※）xxx/db/development.sqlite3

具体的に以下でご説明します。

＜やりたい事＞  
①データベース上には数秒間隔でデータが蓄積されている。  
②Web上からユーザに何分前のデータが欲しいか数字を入力  
→ 例えばユーザが5を選択  
③データベース上、直近のデータからユーザが指定した時間（例では５分前までのデータ）  
までのデータ取り出す

＜現状自分で解決できていない事＞  
ユーザから入力された変数をcontrollersに持ってくるところはできているのですが、  
この変数を使って以前のデータを取ってくることができていません。

  
例えば5分前のデータを持ってくるようなケースでは以下のようなコーディングで  
取得できることはわかりました。

from = 5.minutes.ago → ★  
to = Time.now  
hoge = DataClass.where(created_at: from..to).where(dataname: 1).count  
→ 「created_atの中で現時刻から5分前に遡って、datanameが1のデータの数を数える。」  
というコーディング。

データ取得の範囲が5分と決まっていればこれでいいのですが、何分前のデータかを  
ユーザが決められるようにしたいのです。

仮にユーザが入力したデータを"hogedata"としてviewsからPOSTすることでcontrollersに  
データを渡すことができることまではわかりました。  
以下、viewsからPOSTされcontrollersで取得する際のコーディング例です。

hogeid = Rangearrow.maximum(:id) ← ユーザが入力した最後のIDを取得。  
hogedata = Dataclass.where("id = ?",hogeid).pluck(:userdata) ←
hogeidと同様のデータから欲しいデータ(userdata)を取得しhogedataとして保存。  
※userdataがデータベース上の変数名

このhogedataで指定された範囲のデータを取得したいのですが、  
★のイメージでいくと hogedata.minutes.ago とやるとエラーが出てしまいます。

変数の使い方が分かっていないのも理由かもしれませんが、Webを見ても解決できていない状況です。  
特にやり方にはこだわらない(xx.minutes.agoでなくてもいい）のでユーザが入力したデータを  
使ってデータベースのデータを範囲分取得する方法を教えてください。


CC BY-SA 3.0
2016-09-13T07:12:23.653
28853
2016-09-15T14:47:39.483
18773
question
ruby-on-rails
Railsで変数によるデータの取得


## 回答

エラーの内容は、`[5]`という`Array`に`minutes`というメソッドはないということです。

> 変数の使い方が分かっていないのも理由かもしれませんが、Webを見ても解決できていない状況です。

推測ですが、おわかりになっていないのは、変数の使い方ではなく

  * オブジェクト指向 
    * クラス
    * メソッド
    * 他オブジェクト指向に関する知識もろもろ

だと思います。

`hogedata.last.minutes.ago`

とすると `5.minutes.ago`と同様のことができると思います(`hogedata`は`[5]`の前提)。

もしくは  
`hogedata = Dataclass.find(hogeid)`  
とすれば、`hogedata.userdata.minutes.ago` でもよいと思います。

## 追記：コメントへの回答

> minutes.agoとlastを組み合わせて使えるというのはどうすればわかるものなのでしょうか？ ご教授頂けますと助かります。

`hogedata`は`[5]`という配列であることはわかりました。  
`5.minutes.ago`は動くことはすでにわかっています。  
この状況からなんとかして配列`[5]`から`5`を取り出したいわけです。  
なので方法はなんでもよいです。 `hogedata.first`でも`hogedata[0]`でもよいわけです。  
よく見かける例が`.last`なのでこれを選んだというわけです。

そして、メソッドをつなげることは、メソッドチェーンと呼ばれよく使われるプログラミング手法です。  
つまり

[code]

    foo = hogedata.last
    foo.minutes.ago
    
[/code]

と同じことですが、`foo`への代入が無駄です。なのでメソッドチェーンで繋げます。  
（`minutes.ago`がチェーンされている理由とまったく同じです）


CC BY-SA 3.0
2016-09-13T23:04:46.760
28868
2016-09-15T00:29:47.310
2016-09-15T00:29:47.310
9008
9008
28853
answer