#はじめに
ローカルのSQLiteでの開発環境では問題なく動いていたのですが、本番環境(MySQL)にデプロイすると、Ransackを利用したソート機能で例外が発生してしまいました。
対処過程のメモを残しておきます。
#エラー内容
ログに出力されているエラー内容は以下になります。
ActionView::Template::Error (Mysql2::Error: Expression ¥#1 of ORDER BY clause is not in SELECT list, references column 'DB名.テーブル名.カラム名' which is not in SELECT list; this is incompatible with DISTINCT:
#参考URL
以下のページを参考に対処しました。感謝です。
MySQLでdistinctが効かない。mysqlバージョン5.7からの変更。
#MySQLのversion確認
まずはMySQLのバージョンを確認。参考サイトの情報に該当しそうだ。。。
mysqld --version
mysqld Ver 5.7.25 for Linux on x86_64 (MySQL Community Server (GPL))
#SQLモードの確認
続いて、SQLモードの内容を確認。やはり同様である。
mysql> SELECT @@GLOBAL.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
#設定を変更して動作確認
MySQLのconfigファイルを修正してsql_modeを空にする。
sudo vi /etc/my.cnf
my.cnf
[mysqld]
sql-mode=""
修正が終わったら再起動して動作確認
sudo systemctl restart mysqld.service
ソートが動作することを確認できました。
#終わりに
ONLY_FULL_GROUP_BY が原因のようなので、それだけオフにすることも後々検討したい。
また、その他の項目にも是非を確認して設定を見直したい。
こういった事をきちんと出来るようになりたいと思いつつ、忙しさを言い訳にしてまずはこれで良しとしちゃいます。