6.2 the uniqueness caveat when saving into database: adding index to tables!!!

using validates :email, :uniqueness => true 

 

doesn't guarantee uniqueness!!!!!

 

here is why:

 

1. Alice sign up with address alice@wonderland.com

2. Alice accidentally clicks on "Submit" twice, sending two requests in quick succession.

3. the following sequence occurs:  request 1 creat a user in memory that passes validation, request 2 does the same, request 1's user gets saved, request 2's user gets saved.

4. two records with same email address in database.

 

this will probably happen in a scaling server.

 

how to solve it????

 

easy, you just need to enforce uniqueness at the database level!!!


our method is to creste database index on the eamil column, and then require that the index be unique!!

 

so we need to update our data model using a new migration, 

 

rails generate migration add_email_uniqueness_index

 

this will creste an empty file, we need to fill in it:

 

 

class AddEmailUniquenessIndex < ActiveRecord::Migration

  def self.up
    add_index :users, :email, :unique => true 
  end

  def self.down
    remove_index :users, :email
  end

end

 

then rake db:migrate

 

(adding index not only solve the uniqueness problem, it also solve another efficiency problem:

when searching by email column


find_by_email("abcd@abcd.com")

 

)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值