5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails + heroku + order("rand()")が効かない話

Last updated at Posted at 2019-09-17

経緯

就職活動に向けポートフォリオづくりに勤しんでいました。
1つ目のポートフォリオが完成したためherokuにデプロイしていました。

herokuにデプロイ

普段はAWSにデプロイしていたため、herokuのお手軽デプロイにびっくりしました。

herokuのgitレポジトリにpushするだけとは…!これがPaaSなんですね!
DBはmySQLを利用していたため、そこだけをPostgreSQLに変更して早速デプロイしました。

サイトにアクセスできない…!

Image from Gyazo

  1. 色々なリンクにアクセスしてみました

    →なぜかindexだけアクセスできない…
  2. DBが空だと発生するエラーかな?

    →local環境ではDB空でもエラーは発生しない
  3. indexにのみ表示されているランキング周りのエラーかな?

    →なんだかそれっぽい!

Image from Gyazo(この機能)

herokuのエラーログの確認方法は…?

【Rails】ローカルにないエラーがherokuで表示された時の対処法
https://qiita.com/YukiWebTech/items/68b2efa252cea7148173

heroku 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ドルプランも試してみようかなと思っています。

5
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?