查询模型中不同格式的电话号码

时间:2015-07-08 21:21:14

标签: ruby-on-rails ruby

有一个名为" Person"的表。属性id为主键,phone_number来自用户输入,因此它们以不同方式格式化。我需要用电话号码查询id。 例如,Person.where(:phone_number => 4155332321) 但是,模型中的数字可能是415-533-2321或4155332321.我怎么能为此编写查询? 顺便说一句,我无法更改模型中的电话号码格式。否则,我可以将查询和模型中的手机转换为相同的格式。 感谢

1 个答案:

答案 0 :(得分:0)

我认为你需要一个由两部分组成的方法。

首先,您还想要保存一个"标准化的"电话号码到数据库。这根本不包含任何格式 - 只是数字。这将要求您向数据库添加新列,例如normalized_phone_number并编写before_save回调来存储此值。

class Person
  before_save :normalize_phone_number

  def self.normalize_number(number)
    number.gsub(/[^\d]/, '') if string.present?
  end

  def normalize_phone_number
    self.normalized_phone_number = Person.normalize_number(self.phone_number)
  end
end

接下来,您将要编写一个自定义类方法,以根据用户输入的标准化数字查找此人。您的Person课程现在将包括:

class Person
  def self.with_normalized_phone_number(phone_number)
    where(normalized_phone_number: normalize_number(phone_number)).first
  end
end

您也可以将Person.with_normalized_phone_number写为ActiveRecord范围,这是我的偏好,但是"Using a class method is the preferred way to accept arguments for scopes."