我不时会注意到用户的电子邮件是重复的.即使使用模型验证(应用程序级别)来检查唯一性.我怀疑这与并发问题有关.
我决定在数据库级别添加一个索引来解决这个问题.
无论如何,较低的指数可能是明智的.
即使我们保证在应用程序级别降低电子邮件.数据库提供了更强的一致性保证.
它可能永远不会重要,但让数据库强制执行它也不会受到伤害.
我可以提供许多额外的保护措施,以最大限度地提高从应用程序端输入大写字符的几率,但应用程序仍然无法控制从其他来源进入数据库的数据,并且所有代码都倾向于开发人员错误,维护成本等
class CreateUniqueIndexForUserEmails < ActiveRecord::Migration
def up
remove_index :users, :email
execute <<-SQL
CREATE UNIQUE INDEX index_users_on_lower_email ON users (LOWER(email));
SQL
end
def down
execute <<-SQL
DROP INDEX index_users_on_lower_email;
SQL
add_index :users, :email
end
end
Run Code Online (Sandbox Code Playgroud)
我还将此逻辑与user
模型中的此代码块相结合:
def email=(value)
write_attribute :email, value.downcase
end
Run Code Online (Sandbox Code Playgroud)
这确保FooBar@email.com
重写为foobar@email.com
(在应用程序级别).
我在线阅读了一篇RFC,主要来自Are电子邮件地址区分大小写的指针?表明一些电子邮件服务器关心区分大小写.
即便如此,当我今天发送电子邮件时.我几乎不把心思放进肠衣里.事实上,我输入的电子邮件是羽绒服.电子邮件仍然可以发送
RFC是否值得高度考虑?即如果用户输入FooBar@email.com
,app将电子邮件注册为foobar@email.com
.这会对电子邮件"可传递性"产生任何影响吗?
如果没有,我应该考虑哪些其他问题?
归档时间: |
|
查看次数: |
76 次 |
最近记录: |