将电子邮件存储为羽绒服的任何问题?

Chr*_*ini 5 ruby-on-rails

我不时会注意到用户的电子邮件是重复的.即使使用模型验证(应用程序级别)来检查唯一性.我怀疑这与并发问题有关.

我决定在数据库级别添加一个索引来解决这个问题.

无论如何,较低的指数可能是明智的.

即使我们保证在应用程序级别降低电子邮件.数据库提供了更强的一致性保证.

它可能永远不会重要,但让数据库强制执行它也不会受到伤害.

我可以提供许多额外的保护措施,以最大限度地提高从应用程序端输入大写字符的几率,但应用程序仍然无法控制从其他来源进入数据库的数据,并且所有代码都倾向于开发人员错误,维护成本等

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.这会对电子邮件"可传递性"产生任何影响吗?

如果没有,我应该考虑哪些其他问题?

小智 1

Devise 在电子邮件属性上应用小写,所以我认为这不是问题。

请参阅: https: //github.com/plataformatec/devise/blob/f7b6d786066cef2f5e8d2ce9c6b6cc83918580eb/test/models/database_authenticatable_test.rb#L17

请参阅 Devise 测试文件中的其他断言以了解要考虑的转换。