Posts Tagged ‘unicode’

validates_uniqueness_of 对中文验证无效

Thursday, March 19th, 2009

用 restful_authutication 遇到一个奇怪的问题, validates_uniqueness_of 对中文验证无效, 搜索一下发现有人报告过, 看上去已经解决了, 但是在 2.2.2 中仍然不行, patch 中修改的是

--- a/activerecord/lib/active_record/validations.rb
+++ b/activerecord/lib/active_record/validations.rb
@@ -664,7 +664,7 @@ module ActiveRecord
             condition_params = [value]
           else
             condition_sql = "LOWER(#{sql_attribute}) #{comparison_operator}"
-            condition_params = [value.downcase]
+            condition_params = [value.chars.downcase]
           end

但是 2.2.2 中看到的代码是 condition_params = [value.mb_chars.downcase]

没仔细研究失效的原因, 自己加了点代码解决:

validates_uniqueness_of   :login,    :if => Proc.new {|user| !user.login.is_utf8?}

当 login 是 utf-8 的时候直接跳过这步, 接下来自己再验证一下:

def validate
  user = User.find(:first, :conditions => ["login=?", self.login])
  if !user || user != self
    self.errors.add :login, "用户名已被注册"
  end
end

问题解决了, 但不一定是最好的办法, 有人也遇到同样的问题么?

Ferret中搜索中文

Monday, July 2nd, 2007

上次看ferret没有找到搜中文的好办法, 今天再死磕一次.

发现acts_as_ferret都进gem了…但是还是不能搜中文!

最终找到一个支持非拉丁语系言语搜索的插件, 作者自己写了一个Analyzer, 装上就OK了, 姑且算是一个办法, 至于质量和具体的实现方式接下来再考证.

还有一片来自宝岛上的文章可以看一下.

[Update 200-7-3] Generate index from mime-type file with ferret
我为什么要用ferret,原因在于招聘系统收到了大量的简历,80%为MSWord,10%+为PDF,一个一个打开看受不了,想用关键词搜索。所以提出一个方案-招聘系统不接受附件,简历直接扔到textarea里面,这样不就能查了么。于是乎Rails重新完成一套系统,时间不超过3天,而用SQL like去查又太小儿科了,数据多了也受不了。于是乎想到Ferret

但是简历在线编辑就爽么?我精心制作的CV岂不是就没意义了!

对用户上传的简历做索引才是王道!于是乎找到了一个叫ff的小工具,利用pdf2text,html2text,antiword 抓出文件内容再利用ferret做index,还可以和rails集成!

[Update 2007-7-3] Run ferret in DrbServer
在production环境下你那一群mongrel很可能跑在N多application server上,这时不能让每个server上都维护一个local ferret,于是乎我们把ferret跑在一个远程的DrbServer上面。方法很简单,acts_as_ferret已经为我们做好了封装,而Drb也是跟随ruby作为内嵌库来的。

不过我发现了一个问题,用gem安装acts_as_ferret后缺少配置文件config/ferret_server.yml 和启动脚本script/ferret_start ferret_stop,应该说是装gem的时候这几个文件没放对地,我手工copy过来也不能用,原因大概是没有正确的require ‘acts_as_ferret’,不知道是我gem装的有问题还是这gem有问题。

最终还是用plugin的方式安装了acts_as_ferret,一切正常。修改一下ferret_server.yml配置文件,script/ferret_start启动DrbServer。再修改一下model,加上:remote => true。Finish!

之后又遇到一个问题,如果需要和其它东西一起做混合式搜索,比如一张表只有一个字段想用ferret处理,其它字段仍然用sql处理怎么办?一个在DB里搜,一个在索引里搜,hack一下代码把两者mix起来?那最终在做pagination怎么办,能处理offset和page number limit么?

最终还是时间优先,采用最简单的方法,ferret搜索的时候用find_id_by_contents查出所有的匹配id,再与其它条件一起放到sql的where条件里搜。两分钟修改完成。

关于DrbServer的配置方法可以参考官方wiki

Rail处理Unicode问题

Monday, November 27th, 2006

中国人写应用似乎第一个要处理的重大问题总是Unicode,中文的双字节和英文的单字节差异带来的麻烦真实浪费了我们不少时间。

Rails应用处理Unicode可以参考石锅拌饭的一篇文章和他也参考过的一篇文章

在我处理的过程中一直遇到一个collation冲突的问题,原来是我用了CocoaMySQL的前段工具操作DB,里面有一栏写着Encoding:UTF8,我信以为真,结果mysqldump导出sql文件一看,我的所有表还是latin1,无语,手工改了一下sql再导回去,一切OK

同样是处理中文,Rails感觉比Java的东东方便很多…不过还有一个问题没有解决,OSX下面安装的MySQL配置文件在哪?一直没有找到,官方的中文5.1文档上也没见影子。