我经常发现自己编写这样的代码:
song.rb:
:before_save :cache_sortable_name
private
def cache_sortable_name
return unless name_changed?
self.sortable_name = name.sub(/^(the|a|an)\s+/i, '')
end
即,我有一个sortable_name
数据库列,为了方便起见,它保存了非规范化数据,我想在模型名称发生变化时填充它。
我希望能够将此逻辑封装在诸如此
之类的构造中:cache_in_database :sortable_name do
name.sub(/^(the|a|an)\s+/i, '')
end
或者其他什么。这是否存在?
答案 0 :(得分:1)
所以......你想要一个名为“cache_in_database”的回调,它带有一个属性和一个块,并在每次保存之前将该属性设置为块的返回值。是吗?
我还没有听说过这样的事情,但这是一个很容易写的插件。只需编写 cache_in_database 类方法,该方法获取属性和块参数,创建执行赋值的proc或方法,并将其添加到 before_save 链。对我来说,问题是你是否经常这样做 ,每次都要保存一行代码,这是值得增加的魔力。