正しいアルファベット順 - プラットフォーム全体のソリューション

概要

現在、私たちのアプリでは、データをアルファベット順に並べるシステムのデフォルトの方法をオーバーライドせず、大文字を小文字よりも優先して並べ替えます。

照合順序を変更せずに、アプリケーション全体で大文字と小文字を区別しないようにするにはどうすればよいですか?

データベース: PostgreSQL

これについて何かアイデアはありますか?

解決策

手っ取り早い回避策は、次のようなスコープを ApplicationRecord に追加することです。

scope :order_ci, ->(attribute) { order("LOWER(#{attribute})") }

または、特定の照合順序を使用して次のようにします。

scope :order_ci, ->(attribute) { order("#{attribute} COLLATE en_US.UTF-8") }

そして、そのスコープを Foo.order(:name) の代わりに Foo.order_ci(:name) のように使用します。

ただし、この「ソリューション」には多くの欠陥があることに注意してください。Ruby on Rails に付属する順序メソッドは、多くのデータ型と形式 (単一の値、ハッシュ、文字列、リスト) を受け入れ、同時に 1 つだけではなく多くの属性を受け入れます。 Rails メソッドは入力を正しくサニタイズしましたが、このメソッドはサニタイズしません。

つまり、データベースの照合順序を修正する代わりに、このような回避策を使用したい場合です。次に、オーバーライドされたメソッドが基本的にすべてのデータ形式を処理でき、Ruby on Rails メソッドと同様に適切なサニタイズを実行できることを確認する必要があります。そうしないと、最良の場合にはバグが発生する危険があり、最悪の場合にはセキュリティ上の脆弱性が発生する危険があります。