我对如何在一列中存储电话号码有些困惑。以下是要求:
- 用户可以拥有多个电话号码。
- 电话号码必须唯一,因此如果用户A添加了用户B使用的电话号码,则应显示验证错误。
- 如果用户有多个电话号码,则应选择默认电话号码。
- 解决方案必须与Postgresql兼容。
- HStore: 创建一个“phone_number”字段,存储所有电话号码的哈希值。例如:
{1=>"+1-800-123-1234", 2=>"9237492734", "default"=>1}
。在这种情况下,我需要进行很多查询来确保新的电话号码是唯一的,例如我需要查询User.where("phone_number @> ('1' => '+1-800-123-1234')")
然后检查2个User.where("phone_number @> ('2' => '+1-800-123-1234')")
...等等。 - 在一个字段中存储电话号码的数组:
phone_number
将存储逗号分隔的电话号码,例如"+1-800-123-1234,9237492734"。检查现有电话号码将很容易User.where("phone_number LIKE '%+1-800-123-1234%'")
但是数据库需要很长时间才能处理。还可以像惯例一样将第一个电话号码作为默认电话号码,或添加default_phone
字段。 - 限制电话号码为3(足以满足需求),并分别创建
phone_number_1
,phone_number_2
和phone_number_3
字段。检查电话号码的唯一性将消耗3个查询。此外还需要添加default_phone
。 - 添加一个新表
phone_numbers
(id:integer,user_id:integer,phone_number:string,default:boolean),并设置与User模型的has_many关系。虽然没有那么吸引人,但它具有快速查找的优势,并且每个用户都可以拥有无限数量的电话号码。