【问题标题】:Mass downcase a field for all records in rails批量小写rails中所有记录的字段
【发布时间】:2011-03-12 22:57:44
【问题描述】:

当我第一次实现用户模型时,我允许用户输入大写或小写的电子邮件作为他们的登录信息。问题在于它是一个移动应用程序,有时会发生自动大写,因此用户不会获得身份验证。我已将 CREATE 方法更改为首先将电子邮件小写。但是,这会导致现有帐户的人不一致

那么如何添加迁移以批量更新用户表中的电子邮件字段以将其小写?

【问题讨论】:

  • 电子邮件地址不区分大小写,因此应始终将其折叠为小写以便比较和存储。这是在应用程序设计过程中被忽视的事情之一......曾经......然后你就会永远记住它。 :-)
  • 不正确。电子邮件地址区分大小写。 RFC5321 规定:[邮箱的本地部分必须被视为区分大小写。因此,SMTP 实现必须注意保留邮箱本地部分的大小写。特别是,对于某些主机,用户“smith”与用户“Smith”不同。]也就是说,出于实际原因,我同意缩小电子邮件地址,特别是用于比较,是值得的。

标签: ruby-on-rails ruby database activerecord


【解决方案1】:

最有效的方法是避免使用 Ruby 迭代器,而是直接在 SQL 中执行。

在正常的迁移文件中,您可以使用此 SQL for MySQL:

execute("UPDATE users SET email = LOWER(email)")

【讨论】:

  • 一般会加上一些代码需要修改,所以比较都是小写的,新插入的记录会折叠成小写,避免问题再次出现。跨度>
【解决方案2】:

你可以简单地去

User.update_all('email = lower(email)')

【讨论】:

  • 喜欢这个解决方案。
【解决方案3】:

最简单的解决方案是只使用 Ruby 代码:

class DowncaseEmail < ActiveRecord::Migration
  def up
    User.all.each do |user|
      user.update_attributes :email => user.email.downcase
    end
  end
end

正如其他人所指出的,这不是最有效的解决方案。我更喜欢可移植性而不是性能,但这取决于我们谈论的记录数量。

更复杂但仍可移植的解决方案取决于一些特定于数据库的功能:

class DowncaseEmail < ActiveRecord::Migration
  def up
    if %w[MySQL PostgreSQL].include? ActiveRecord::Base.connection.adapter_name
      execute "UPDATE users SET email = LOWER(email)"
    else
      User.all.each do |user|
        user.update_attributes email: user.email.downcase
      end
    end
  end
end

PostgresMySQL 都支持 LOWER 函数。 SQLite 也支持它,但仅适用于 ascii 编码,这可能适用于电子邮件,但可能会导致错误(因为某些电子邮件可能包含其他字符)。 Rails 还可能支持任意数量的数据库,因此依赖这些功能可以使您的应用程序锁定在特定的数据库中。

【讨论】:

    【解决方案4】:

    不必担心优化您只会做一次的事情。除非您拥有大量用户,否则请使用您最熟悉的方法。 (虽然我建议只运行 SQL 查询。)

    【讨论】:

    • 感谢大家的解决方案。我只有大约 300 个用户,所以对我来说只做一个简单的迁移是最简单的。干杯。
    【解决方案5】:

    下面是最简单的解决方案,而不是迭代:

    ActiveRecord::Base.connection.execute "UPDATE users SET email = LOWER(email)"
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多