拦截find_by_attribute方法的活动记录

时间:2012-01-22 02:09:05

标签: ruby activerecord ruby-1.9.2

我有一个有手机的型号

手机在数据库中使用特定格式存储。 我想拦截User.find_by_cellphone(“1234567890”)并规范手机,然后拨打“真正的”find_by_cellphone(“123-456-7890”)。

我该怎么做?我正在考虑将find_by_cellphone重命名为ar_find_by_cellphone,然后覆盖find_by_cellphone并在其中调用ar_find_by_cellphone。还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

实际上没有名为find_by_cellphone的方法,只是ActiveRecord使用Ruby的method_missing神奇地为你动态地执行此操作。

要执行您想要的操作,只需将find_by_cellphone定义为Cellphone类中的类方法,它将使用此方法而不是内置方法:

def self.find_by_cellphone(number)
  normalized_number = ... # normalize your number
  self.where(:cellphone => normalized_number).first
end