RSS
热门关键字:  java  Ajax  JSP  JSF  Struts
当前位置 : 首页>Ruby>列表

Rails宝典之第二式: 动态find_by方法

来源: 作者: 时间:2007-09-19 点击:
  •     set_readonly_option!(options)   
  •   
  •     find_initial(options) || send(instantiator, attributes)   
  •   else  
  •     super  
  •   end   
  • end   
  •   
  • def extract_attribute_names_from_match(match)   
  •   match.captures.last.split('_and_')   
  • end   

  • 看看第一行代码:if match = /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match(method_id.to_s)
    这是一个正则表达式匹配:
    ^匹配一行的开始
    $匹配一行的结束
    \w匹配一个词语,可以是数字、字母、下划线
    []匹配括号里面符合的一个字符
    *匹配0个或多个它前面的字符或短语
    则([_a-zA-Z]\w*)则匹配以下划线或任意小写字母或任意大写字母开头的一个字符串
    具体参考《Programming Ruby》中的Regular Expressions一章

     

    而extract_attribute_names_from_match方法也很有意思,match.captures返回匹配的字符串组成的数组,last返回最后一个元素,如:

    代码
    1. /^(a)_(b)_(\w*)$/.match("a_b_c_d_e_f_g").captures # => ["a""b""c_d_e_f_g"]   
    2. /^(a)_(b)_(\w*)$/.match("a_b_c_d_e_f_g").captures.last # =>"c_d_e_f_g"  
    3. /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match("find_by_a_and_b_and_c").captures.last # => "a_and_b_and_c"  

     

    这样,第一行代码所匹配的方法名具体为find_by(或all_by)_aaaBBB形式
    而extract_attribute_names_from_match允许我们匹配形式为find_by(或all_by)_aaaBBB_and_cccDDD_and_eeeFFF_and_...的方法
    即我们可以无限添加查询条件,通过_and_连接字段名即可

    而且可以看出,我们还可以调用find_by_columnName、find_or_initialize_by_columnName、find_or_create_by_columnName等动态方法。

    总结:
    动态语言可以做出很强大的框架,完成很多有意思的工作,这是Java、C#这种静态语言望尘莫及的。
    本例中的find_by方法就是利用Ruby的method_missing语法特性来为Model动态生成方法,我们可以称其为POJO增强。

    JavaScript也是一门大家可能忽略了但又十分强大的动态语言,参考Ruby和Python,JavaScript还有很大潜力可挖。

    共3页: 上一页 [1] [2] 3 下一页
    [收藏] [推荐] [评论] [打印] [关闭]
    上一篇:rails的UTF-8支持造成的正则表达式问题
    下一篇:RoR的正确定位
    最新评论共有 0 位网友发表了评论
    发表评论
    评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
    用户名: 密码:
    匿名?
    注册
    热点关注
    Google Adsense
    相关文章