2017-02-09 8 views
0

今日、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の予想される動作です。なぜ私の開発環境(同じマシン上)が大文字と小文字を区別しない検索を行っていたのかは不明です。私はさらに情報を見つけたら更新します...

+1

バックエンドデータベースは何ですか?まったく同じクエリが実行されていても、バージョンに違いがある可能性があります。また、サーバーの既定値によるスキーマの違いもあります。たとえば、[照合に依存するMySQLの場合](https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html)。開発表スキーマと実動スキーマを比較し、相違点を探します。 – tadman

+0

この特定の状況では、すべてが同じである必要があります。同じコンピュータ、同じバックエンドデータベース(Postgres)です。すべての移行を実行することによって開発モードでDB全体を再生成しました。その後、すべての移行を再実行して本番データベースを再作成しました。しかし、要点。私は、2つの間の最終的なテーブル/スキーマに違いがあるかどうかを確認できます。 – CodeSmith

+1

ここでは、結論を出すのではなく、ここで提案しています。これは微妙な照合の問題である可能性が非常に高いです。作業データベースの 'pg_restore'を試してみましたか? – tadman

答えて

6

Postgresは、デフォルトでは大文字と小文字が区別されます。大文字と小文字の区別を避けるためにILIKEを使用できます。

LIKEの代わりにキーワードILIKEを使用して、アクティブなロケールで大文字と小文字を区別しないようにすることができます。これはSQL標準にはありませんが、PostgreSQLの拡張機能です。

または小文字の両方を変更し、検索:

User.where("LOWER(email) = ?", email.downcase) 
+0

ありがとうございました。私はILIKEまたはLOWERの使用を避けることを望んでいます。うまくいけば、私は2つの環境が異なって行動している理由を追跡することができます...それは私を恐れる。 – CodeSmith

1

私は確信していません、なぜ正確にそれを行いますか。しかし、単純な解決策があります。

これをモデルに入れます。

例:user.rbは

class User < ActiveRecord::Base 
    before_save { self.email = email.downcase } 
end 
関連する問題