一直以来,对于一些选项类的操作,会设置常量和对应的描述。典型情况如下:
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'。
这样,以后定义常量和对应的描述就可以更轻松一些了。
分享到:
相关推荐
+arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +cryptv +cscope +cursorshape +dialog_con_...
reset_jetbrains_eval_windows.rar
+arabic +autocmd +balloon_eval +browse ++builtin_terms +byte_offset +cindent +clientserver +clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments +conceal +cryptv +cscope +cursorbind +...
请注意,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/...
脚本语言支持有:Python 2.7、Python 3.3、Ruby 2.0.0、Lua 5.2(只需要能找到 lua52.dll 文件已经自带 lua52.dll 文件,方便各位使用 neocomplete 插件)。 md5sum: 2cfd2cbc8048c6b2c5483248e02e7ad0 VIM - Vi ...
脚本语言支持有:Python 2.7、Python 3.3、Ruby 2.0.0、Lua 5.2(只需要能找到 lua52.dll 文件已经自带 lua52.dll 文件,方便各位使用 neocomplete 插件)。 md5sum: 1acd40c636111e838e0ec20792c04ff3 VIM - Vi ...
torch_mir_eval Pytorch实施 。 Nvidia RTX 3090,ADM Threadripper 1920X单次运行 .bss_eval_sources test>permutation: Falsefloat32 CPU: 3.004torch-CPU: 2.512.bss_eval_sources test>Compute permutation: ...
#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 ...
license_eval_halcon_progress_2022_03.dat
arm_cortex_m3_designstart_eval,arm cortex m3的设计文档
借助Faster R-CNN中voc_eval.py文件,测试YOLO测试数据集mAP等结果,博客见
license_eval_halcon_steady_2021_07
STM3210C_EVAL 的 LL 和 HAL 例程
可以无限重置
$(eval $(call BuildPackage,r8188eu-firmware)) (RTL8188FU请直接参照RTL8188EU修改即可:) Package/r8188fu-firmware = $(call Package/firmware-default,RealTek RTL8188FU firmware) define Package/r8188fu-...
license_eval_halcon_steady_2021_08
trec_eval_latest.tar trec_eval_latest.tar trec_eval_latest.tar
这个BasicObject#instance_eval有点类似JS中的bind方法,不同的时,bind是将this传入到对象中,而instance_eval则是将代码块(上下文探针Context Probe)传入到指定的对象中,一个是传对象,一个是传执行体。...
java开发包含jar j4locr_eval技术所含包,以及操作
GD32F450I_EVAL官方评估板 _LittlevGL代码移植