経緯
就職活動に向けポートフォリオづくりに勤しんでいました。
1つ目のポートフォリオが完成したためherokuにデプロイしていました。
herokuにデプロイ
普段はAWSにデプロイしていたため、herokuのお手軽デプロイにびっくりしました。
herokuのgitレポジトリにpushするだけとは…!これがPaaSなんですね!
DBはmySQLを利用していたため、そこだけをPostgreSQLに変更して早速デプロイしました。
サイトにアクセスできない…!
- 色々なリンクにアクセスしてみました
→なぜかindexだけアクセスできない…
- DBが空だと発生するエラーかな?
→local環境ではDB空でもエラーは発生しない
- indexにのみ表示されているランキング周りのエラーかな?
→なんだかそれっぽい!
herokuのエラーログの確認方法は…?
【Rails】ローカルにないエラーがherokuで表示された時の対処法
https://qiita.com/YukiWebTech/items/68b2efa252cea7148173heroku logs -t #-tでも-tailでもOK
上記を参考にしてlogを確認しました。
ActionView::Template::Error (PG::UndefinedFunction: ERROR: function rand() does not exist
LINE 1: SELECT "weblogs".* FROM "weblogs" ORDER BY rand() LIMIT $1
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
やはりランキング周りのエラーだったようです。どうやら
@random_rank = Weblog.order("rand()").limit(3)
このorder("rand()")がherokuではうまく動作していないらしい?
Rails + Heroku + Postgres で日本語の order がうまくいかない対処法
https://qiita.com/star__hoshi/items/e53cc5b770905fd49da6
ちなみにorderを削除して
@random_rank = Weblog.limit(3)
と書き直したらerrorは解決されました。やはりrand()がだめらしい。
いろいろ調べてみた
Rails Postgresql sort by random
https://stackoverflow.com/questions/13641007/rails-postgresql-sort-by-random
1st approach
Hashtag.order("RANDOM()").limit(4)
2nd approach:
Hashtag.all.sample(4)
SQL: 1.8ms
Sample Method: 4.2ms
どうやらrand()はmySQLのみでしか使えず、PostgresqlではRANDOM()を使う必要があるそうです。
他にはActiveRecodeのsampleメソッドでも必要な数を取得できるようです。
ただしSQL文を用いたほうが処理が早いとのこと。
結論
処理は早いほうが良いので、本番環境か否かで場合分けを行うことにしました。
rand = Rails.env.production? ? "RANDOM()" : "rand()"
@random_rank = Weblog.order(rand).limit(3)
感想
初のherokuデプロイとPostgreSQLの利用で少しだけ戸惑いました。
しかしお手軽な上に無料で利用することができるherokuをもっと利用したいと考えています!
次はSSL認証が使える月7ドルプランも試してみようかなと思っています。