我有一个ActiveRecord
模型Foo
,它有一个name
字段。我希望用户能够按名称搜索,但我希望搜索忽略大小写和任何重音。因此,我还存储了一个要搜索的canonical_name
字段:
class Foo
validates_presence_of :name
before_validate :set_canonical_name
private
def set_canonical_name
self.canonical_name ||= canonicalize(self.name) if self.name
end
def canonicalize(x)
x.downcase. # something here
end
end
我需要填写“这里的某物”来替换重音字符。还有比这更好的吗?
x.downcase.gsub(/[àáâãäå]/,'a').gsub(/æ/,'ae').gsub(/ç/, 'c').gsub(/[èéêë]/,'e')....
而且,因为我不是在Ruby1.9上,所以我不能在我的代码中放入那些Unicode文字。实际的正则表达式看起来会丑陋得多。
发布于 2008-11-15 06:18:52
Rails已经有一个用于规范化的内置代码,你只需要使用它来规范化你的字符串,形成KD,然后像这样删除其他字符(即重音符号):
>> "àáâãäå".mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s
=> "aaaaaa"
发布于 2011-08-23 11:47:20
ActiveSupport::Inflector.transliterate
(需要Rails 2.2.1+和Ruby1.9或1.8.7)
示例:
>> ActiveSupport::Inflector.transliterate("àáâãäå").to_s => "aaaaaa"
发布于 2013-12-14 18:33:35
更好的方法是使用I18n:
1.9.3-p392 :001 > require "i18n"
=> false
1.9.3-p392 :002 > I18n.transliterate("Olá Mundo!")
=> "Ola Mundo!"
https://stackoverflow.com/questions/225471
复制