2

ファイル名があります。file_name一致する属性を持つレコードを見つける必要があります。

私の問題は、ファイル名が音訳されていることです。これは一方向のプロセスです。ファイル名を音訳しない方法はないので、レコードのfile_name属性の音訳されたバージョンに基づいて比較する以外に選択肢はありません。

ファイル名を比較するだけなら、次のようにします。

Example.where(file_name: file_name}

音訳できない場合は、次のfile_nameようにします。

Example.where(file_name: ActiveSupport::Inflector.untransliterate(file_name)

しかし、私はできないので、どうすれば効率的に同等のことを行うことができますか:

Example.all.detect do |e|
 ActiveSupport::Inflector.transliterate(e.file_name) == file_name
end
4

2 に答える 2

3

文字変換された値を保持する別のフィールドを追加します。それは簡単です:

Example.where(transliterated_file_name: file_name)

それがオプションでない場合、それは非常に簡単ではありません。all を find_each に置き換えることもできますが、アプリケーション レベルで値を比較する必要があります。

于 2013-10-26T13:25:41.370 に答える
1

Tumas が提案したように、新しい列を追加することは機能しますが、フィールドの ASCII への変換をサポートするデータベースを使用している場合は、そのオプションを検討することをお勧めします。

MySQL:

Example.where("file_name COLLATE utf8_general_ci = ?", file_name)
于 2013-10-26T13:34:20.827 に答える