基于改变属性值的查询Rails模型

时间:2013-10-26 13:06:11

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有一个文件名。我需要找到一个匹配file_name属性的记录。

我的问题是文件名已被音译,这是一个单向过程。我无法 un 音译文件名,因此我没有其他选择,只能根据记录的file_name属性的音译版本进行比较。

如果我只是比较文件名,我会这样做:

Example.where(file_name: file_name}

如果我能 un 音译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

2 个答案:

答案 0 :(得分:3)

添加另一个包含音译值的字段。然后很容易:

Example.where(transliterated_file_name: file_name)

如果它不是一个选项,那么它并不容易。您可以将all替换为find_each,但仍需要在应用程序级别上比较值。

答案 1 :(得分:1)

添加新列可以像Tumas建议的那样工作,但是如果您使用的数据库支持将字段转换为ASCII,则可能需要考虑该选项。

<强> MySQL的:

Example.where("file_name COLLATE utf8_general_ci = ?", file_name)