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