今日、Rails 5.0.1アプリをデバッグしているうちに、次のような予期しない問題が発見されました。私は[email protected]
というメールを持っているユーザーをデータベースに持っています。私が走ったときRailsは本番環境では大文字と小文字を区別しますが、開発では区別しないのはなぜですか?
User.find_by(email: "[email protected]")
生産中、私はnil
を返します。しかし、私が実行すると、
User.find_by(email: "[email protected]")
が見つかりました。変わった部分は、これはRailsアプリが開発モードで実行されているときには起こりません。私は[email protected]
または[email protected]
で問い合わせることができ、常にレコードを見つける。
Railsが本番環境で大文字と小文字を区別して検索する原因は何でしょうか?データベースはPostgresです。これらはすべて同じコードで同じマシン上でテストされています。
アップデート2017年2月10日
残念ながら、この問題は私の開発環境を再構築した後、去っていきました。以下のコメントの一部を読んだら、プロダクションで大文字と小文字を区別した検索がPostgres/Railsの予想される動作です。なぜ私の開発環境(同じマシン上)が大文字と小文字を区別しない検索を行っていたのかは不明です。私はさらに情報を見つけたら更新します...
バックエンドデータベースは何ですか?まったく同じクエリが実行されていても、バージョンに違いがある可能性があります。また、サーバーの既定値によるスキーマの違いもあります。たとえば、[照合に依存するMySQLの場合](https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html)。開発表スキーマと実動スキーマを比較し、相違点を探します。 – tadman
この特定の状況では、すべてが同じである必要があります。同じコンピュータ、同じバックエンドデータベース(Postgres)です。すべての移行を実行することによって開発モードでDB全体を再生成しました。その後、すべての移行を再実行して本番データベースを再作成しました。しかし、要点。私は、2つの間の最終的なテーブル/スキーマに違いがあるかどうかを確認できます。 – CodeSmith
ここでは、結論を出すのではなく、ここで提案しています。これは微妙な照合の問題である可能性が非常に高いです。作業データベースの 'pg_restore'を試してみましたか? – tadman