質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

272閲覧

rakeファイルを用いる以外でwebAPIのリクエストを定期実行する方法について

widget11

総合スコア221

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/08/05 09:24

こちらの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を使用しても、少ないテーブル数で表示する方法があるのかということです。知識が足りなすぎて不甲斐ないですが宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

モデルを100-200作る必要はありません。

作る必要のあるモデルは

  • リーグデータ
  • クラブデータ
  • 選手データ
  • 試合結果

でしょう

あとは、なんらかのバックグラウンドジョブによってこれらを更新・もしくは貯蓄して行きます

投稿2018/08/05 09:49

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

widget11

2018/08/05 20:19 編集

ご回答ありがとうございます! もし良ければもう少し具体的に教えて欲しいのですが。例えば選手データというモデルとテーブルも一つだけ作ってそこに全部(リクエストしたURIの数だけ)のデータを詰めていくということでしょうか? 個人的に、club1という名前のサッカークラブがあったら選手のデータ(名前、国籍、ポジションなど)を突っ込むclub1_playersというテーブルに対しClub1_playerというモデルが存在するといった形でクラブ数分モデルとテーブルを用意しなければならないと思っていたのですが、、、何かもう少し効率の良いDBの設計方法があるということなのでしょうか? 正直、クラブのidとそのクラブに所属している選手データのうまいリレーション方法が思いつかなかったです。。。
asm

2018/08/05 20:54

club1に所属する選手に「所属クラブ: club1」というデータを付与する感じです。 アソシエーションについて学ぶのがよいと思います。 参考までにおそらく リーグ has_many クラブ リーグ has_many 試合結果 クラブ belongs_to リーグ クラブ has_many 選手 クラブ has_many ホームでの試合 クラブ has_many アウェイでの試合 選手 belongs_to クラブ 試合結果 belongs_to リーグ 試合結果 belongs_to ホームのチーム 試合結果 belongs_to アウェイのチーム
widget11

2018/08/05 21:03

細かくリレーションについて教えていただきありがとうございます! 実装イメージが湧いて来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問