Rails中非规范化的抽象?

时间:2009-09-24 23:11:52

标签: ruby-on-rails denormalization

我经常发现自己编写这样的代码:

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

或者其他什么。这是否存在?

1 个答案:

答案 0 :(得分:1)

所以......你想要一个名为“cache_in_database”的回调,它带有一个属性和一个块,并在每次保存之前将该属性设置为块的返回值。是吗?

我还没有听说过这样的事情,但这是一个很容易写的插件。只需编写 cache_in_database 类方法,该方法获取属性和块参数,创建执行赋值的proc或方法,并将其添加到 before_save 链。对我来说,问题是你是否经常这样做 ,每次都要保存一行代码,这是值得增加的魔力。