こちらのAPIを用いてアプリを作っています。
https://www.football-data.org/documentation/quickstart
課金額には応じるのですが、基本的にヨーロッパのサッカーのクラブに所属している選手のデータであったり、最新の試合結果を返してくれるAPIです。単純ですが、この返ってきた値をテーブル上にして表示するというアプリケーションを(APIを使用する練習も兼ねて)作っているのですが問題があります。
その問題なのですが、リクエストを送るURIが多すぎることで、単純にURIが考えただけでも100、200個ほどあります。
つまり世界には様々なサッカーのクラブがあり、5ヶ国のリーグだったら単純に1リーグ20クラブ×5リーグで100クラブ分のエンドポイントがある訳です。
勿論ベースエンドポイントURIは同じなのですが、後に続くパスがクラブによって異なるのです。
最初はなるべく記述量が少なくなるよう1つのコントローラーでviewを表示できるようにするというルーティングをしており (参考):Controllerを作らずにViewを表示したい
view側で直接APIへリクエストするruby文を埋め込んでおりました。
html.erbテンプレートファイルでリクエストをし、帰って来たjson(ハッシュ)データを配列にして返しmapメソッド等を用い整形し、foreach文でテーブルに表示ということを行なっていました。
ですがこのteratailでそのような設計はまずいとの指摘を受け、task等に記述し、定期的にリクエストを送る処理を実行させるべきとのアドバイスも頂きました。確かにこのwebAPIもリクエスト制限(1分間に10リクエスト)があるため、ページを表示するたびにリクエストを送ることになってしまう為、納得でした。
しかしtask、rakeファイルでAPIへのリクエストを行なった場合viewでその値を表示するには、一度DBに保存させてコントローラを用いて必要な値を持ってこなければいけないということです。
そうなると、問題なのがテーブルを大量に作らなければならないということです。個人的にrails g model
を行いマイグレーションファイルを100-200回も作成するのは流石にしんどいのではと感じました。
そこで考えたのがDBに保存せず、そのAPIへリクエストするスクリプトを定期実行させることです。そうすれば逐一DBに保存、削除等を行わなくてもレスポンスの値そのままを定期的viewに反映できると思った為です。方法はまだ検索中なのでまだ分からないのですが、、、
改めて現在の問題を箇条書きで書くと
0. APIにリクエストを送り返って来たハッシュデータを整形して表示したい
0. リクエストを送るURIは100-200くらいある
0. 1URIにつき表示のための1テンプレートなのでテンプレートも数100-200ある
0. しかしviewにリクエスト文をベタ書きするのは設計上まずい
0. rakeファイルを用いて定期的にリクエストを送り値をDBに保存しコントローラー側渡し表示すべき
0. しかしマイグレーションファイルやテーブルをその分、generateするのは本末転倒な気もする
です
長くなってしまいましたが、要すると複数のAPIリクエストとレスポンスを受け取るスクリプトをwheneverのようなライブラリを用いて定期実行させ、且つDBを介さずviewに表示する方法はないのかということです。
もしくはDBを使用しても、少ないテーブル数で表示する方法があるのかということです。知識が足りなすぎて不甲斐ないですが宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/05 20:19 編集
2018/08/05 20:54
2018/08/05 21:03