我不时会注意到用户的电子邮件是重复的。即使使用模型验证(应用程序级别)来检查唯一性。我怀疑这与并发问题有关。
我决定在数据库级别添加一个索引来解决这个问题。
无论如何,较低的指数可能是明智的。即使我们保证在应用程序级别降低电子邮件。数据库提供了更强的一致性保证。
这可能永远不会有问题,但让数据库执行它也不会有害。
我可以提供许多额外的保护措施,以最大限度地提高从应用程序端输入大写字符的几率,但应用程序仍然无法控制从其他来源进入数据库的数据,并且所有代码都是容易出现开发人员错误,维护成本等。
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
我还将此逻辑与user
模型中的此代码块相结合:
def email=(value)
write_attribute :email, value.downcase
end
确保FooBar@email.com
重写为foobar@email.com
(在应用级别)。
我在线阅读了RFC,主要来自Are email addresses case sensitive?的指针,表明某些电子邮件服务器关注区分大小写。
即便如此,我今天发送电子邮件时也是如此。我几乎不把心思放进肠衣里。事实上,我输入的电子邮件是羽绒服。电子邮件仍然可以发送。
RFC是否值得高度重视?即如果用户输入FooBar@email.com
,app会将电子邮件注册为foobar@email.com
。这会对电子邮件“可传递性”产生任何影响吗?
如果没有,我应该考虑哪些其他问题?
答案 0 :(得分:1)
Devise在电子邮件属性上应用了downcase,所以我认为这不是问题。
请参阅Devise测试文件中的其他断言以了解要进行的转换。