`
swachian
  • 浏览: 74798 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

很有收获的一天 class_eval + 扩展ActiveRecord::Base

阅读更多

一直以来,对于一些选项类的操作,会设置常量和对应的描述。典型情况如下:

  CONST_TO_LIST_FOR_NUMBER =   [ 
    ['新建', NEXT_NEW],   
    ['退出', NEXT_EXIT],   
    ['直播分机', NEXT_EXTENSION],
    #  ['语音信箱', NEXT_RECORD],
    ['转人工', NEXT_HUMAN]
  ] 

 而现在更想用形式上更像声明的方式来完成这些设置,于是考虑按validates_xxx的形式完成诸如以下的调用

binary_desc :response_desc, "已回复", "未回复"
const_desc :contact_type_desc, 0 => '没有操作', 1 => '录音', 2=>'SMS', 3 => 'EMAIL'

 前者是针对boolean变量,后者针对有多个值的情况传入一个hash,第一个参数都是要生成的常量+函数名,常量会自动转变成大写。

 

binary_desc相对较简单,

    src = <<-END_SRC   
       #{desc_name.upcase} = [  ['#{true_desc}', true], ['#{false_desc}', false] ] 
    END_SRC
    class_eval src unless const_defined?  desc_name.upcase

 需要注意的是因为true_desc会是中文,所以在#{}两侧要添加单引号。

const_desc相当要复杂些,因为在here doc里面认识外部传入的hash未找到好的办法,目前通过先转成字符串,再在eval时还原出来完成。

    options_arr = (options.map {|key, content|  "#{content}::#{key}"}).join('!')
    src = <<-END_SRC   
      def self.#{desc_name} 
        options_str = '#{options_arr}' 
        options_str.split('!').map {|s| s.split('::') }
      end
    END_SRC
    class_eval src

 join split 和map真的挺好用的。

 

然后要做的事情就是给这两个method找一个存放的地方。

因为很多model类会使用,所以想做成support的形式,感觉放在ActiveRecord::Base是最方便的。于是决定写个rb文件对ActiveRecord::Base进行扩展

active_record_support.rb

class ActiveRecord::Base 
  
  def self.binary_desc(desc_name, true_desc, false_desc)  
      ...
  end  
  
 
  def self.const_desc(desc_name, options = {})
     ...
  end
end

 起初,把这个文件放在config目录下面,同时在environment.rb的最后补充require File.join(File.dirname(__FILE__), 'active_record_support')。运行test和rails都可以成功。

但对于使用了observe的model会出问题。因为require support文件的操作在Rails::Initializer.run之后。这样的话会需要干扰到rails正常的初始化动作才能完成。于是决定还是放到model目录下面去。然后再observer处调用require 'active_record_support'。

 

这样,以后定义常量和对应的描述就可以更轻松一些了。

 

 

 

 

分享到:
评论
1 楼 deng131 2008-04-10  

相关推荐

    trec_eval_latest.tar

    总之,trec_eval.9.0作为TREC评估工具的最新版本,为信息检索领域的研究人员和开发人员提供了强大的评估能力,有助于他们更准确地理解和改进其检索系统的效果。通过使用trec_eval,我们可以确保在不断变化的信息检索...

    Ruby Meta Programming: define_method or class_eval

    另一方面,`class_eval`接收一个字符串或代码块,并将其作为一个在指定类或模块上下文中执行的代码。它可以用来定义方法、添加属性、修改已有方法等。例如: ```ruby class MyClass end MyClass.class_eval do ...

    GVim 7.2.441

    +arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +cryptv +cscope +cursorshape +dialog_con_...

    带lua支持的gvim编辑器

    +arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +conceal +cryptv +cscope +cursorbind +...

    ap算法matlab代码-DARKFACE_eval_tools:DARKFACE_eval_tools

    请注意,eval_tools 预计可与八度一起使用,从 MATLAB 运行时可能会出现错误 docker pull scaffrey/eval_tools_ap:dry_run docker run --rm -it \ -v /path/to/your/submission:/tools/data \ -v /path/to/save/...

    reset_jetbrains_eval_windows.rar

    标题 "reset_jetbrains_eval_windows.rar" 暗示这是一个针对JetBrains开发的IDE在Windows操作系统上的试用重置工具。JetBrains是一家知名软件开发公司,以其高效、功能强大的集成开发环境(IDE)如IntelliJ IDEA、...

    j4locr_eval

    标题“j4locr_eval”指向的是一个与Java开发相关的技术或库,特别是与图像处理或者文本识别有关,因为“j4locr”通常与OCR(Optical Character Recognition,光学字符识别)技术关联。这个“eval”可能表示这是评估...

    gvim 7.4.110 for Windows 32 位,带 +lua 及 Lua 库(开箱即用)

    脚本语言支持有:Python 2.7、Python 3.3、Ruby 2.0.0、Lua 5.2(只需要能找到 lua52.dll 文件已经自带 lua52.dll 文件,方便各位使用 neocomplete 插件)。 md5sum: 2cfd2cbc8048c6b2c5483248e02e7ad0 VIM - Vi ...

    gvim 7.4.110 for Windows 64 位,带 +lua 及 Lua 库(开箱即用)

    脚本语言支持有:Python 2.7、Python 3.3、Ruby 2.0.0、Lua 5.2(只需要能找到 lua52.dll 文件已经自带 lua52.dll 文件,方便各位使用 neocomplete 插件)。 md5sum: 1acd40c636111e838e0ec20792c04ff3 VIM - Vi ...

    STM3210C_EVAL_stm32_STM3210C_EVAL_temperature565_

    STM3210C_EVAL是意法半导体(STMicroelectronics)推出的一款基于STM32系列微控制器的评估板,主要用于开发者进行STM32芯片的功能测试、应用开发和系统验证。这款评估板通常配备了丰富的外设接口,以方便用户对STM32...

    torch_mir_eval:https的反向传播pytorch实现

    torch_mir_eval Pytorch实施 。 Nvidia RTX 3090,ADM Threadripper 1920X单次运行 .bss_eval_sources test&gt;permutation: Falsefloat32 CPU: 3.004torch-CPU: 2.512.bss_eval_sources test&gt;Compute permutation: ...

    license_eval_halcon_progress_2022_03.dat

    license_eval_halcon_progress_2022_03.dat

    GD32F450I_EVAL官方评估板 _LittlevGL代码移植

    GD32F450I_EVAL是一款基于ARM Cortex-M4内核的开发板,由GigaDevice公司生产,具有高性能和低功耗的特点,非常适合于各种嵌入式应用。 首先,我们需要了解LittlevGL的基本概念。LittlevGL是一个用于微控制器的图形...

    I2C.zip_STM3210E_STM32F10X.h_stm32_eval.h_stm32_eval_i2c__stm32f

    #include "stm32_eval_i2c_tsensor.h" #include "stm32_eval.h" #ifdef USE_STM32100E_EVAL #include "stm32100e_eval_lcd.h" #elif defined USE_STM3210E_EVAL #include "stm3210e_eval_lcd.h" #elif defined ...

    GD32107C_EVAL LiteOS FreeRTOS_key uCOS_III_key RTOS Demo源代码.zip

    该压缩包文件包含了一系列关于GD32107C_EVAL开发板上运行的不同实时操作系统(RTOS)的Demo源代码,这些RTOS包括LiteOS、FreeRTOS、uCOS_III和RT-Thread,以及相关的库文件。这里我们将深入探讨这些RTOS及其在GD...

    CrystalC_REVS_ProPlus_Eval_v480.Zip

    同时,评估版虽然有时间或功能限制,但通常足以让开发者对其性能有一个全面的了解,决定是否购买完整版。 在实际开发中,使用代码自动生成流程图工具能够降低代码的理解成本,尤其是在接手他人项目或者进行代码重构...

    reset_jetbrains_eval_windows.vbs

    可以无限重置

    Faster R-CNN中voc_eval.py文件

    借助Faster R-CNN中voc_eval.py文件,测试YOLO测试数据集mAP等结果,博客见

    GD32E103C_EVAL.rar

    GD32E103C_EVAL.rar 是一个针对GD32E103微控制器的资源包,它包含了多个流行的实时操作系统(RTOS)的移植版本,包括FreeRTOS、RT-Thread、ucos_ii、ucosiii以及RTX和LiteOS。这些RTOS的移植为开发者提供了在GD32...

    trec_eval.exe

    trec_eval.exe是一款广泛应用于信息检索领域的效果评价工具,它是由TREC(Text REtrieval Conference)组织开发的,旨在为研究人员提供一种标准化的方式来评估和比较不同的信息检索系统。TREC是国际上颇具影响力的...

Global site tag (gtag.js) - Google Analytics