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 回答