如何包装所有ActiveRecord属性访问器

时间:2009-05-27 19:14:50

标签: ruby-on-rails activerecord

我有一个模型,其中允许属性为null,但是当读取null属性时,我想采取特殊操作。特别是,我想抛出一定的例外。就是这样的事情

class MyModel < ActiveRecord::Base
  def anAttr
      read_attribute(:anAttr) or raise MyException(:anAttr)
  end
end

这一切都很好,但这意味着我必须为每个属性手动编写相同的自定义访问器。

我以为我可以覆盖read_attribute,但是我的覆盖read_attribute永远不会被调用。

2 个答案:

答案 0 :(得分:4)

不确定为什么你需要这样做,但唉:

def get(attr)
  val = self.send(attr)
  raise MyException unless val
  val
end

@object.get(:name)

答案 1 :(得分:1)

这很有趣,我们今天也在研究同样的事情。检查attribute_method.rb,其中存在属性的所有Rails逻辑。您会看到一个define_attribute_methods方法,您应该可以覆盖它。

最后,我认为我们将以不同的方式做到这一点,但这是一个有益的练习。