3

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

歌曲.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

或者其他的东西。这存在吗?

4

1 回答 1

1

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

我还没有听说过这样的事情,但它会是一个易于编写的插件。只需编写一个接受属性和块参数的cache_in_database类方法,创建一个执行分配的过程或方法,并将其添加到before_save链中。对我来说,问题是你是否经常这样做以至于每次节省一行左右的代码都值得增加魔法。

于 2009-09-25T01:19:52.723 回答