Самое простое решение - просто использовать код 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
И Postgres , и MySQL поддерживают функцию LOWER
. SQLite также поддерживает его, но только для кодировки ascii, которая, вероятно, подходит для электронных писем, но может вызвать ошибки (так как некоторые электронные письма могут содержать другие символы).Rails также потенциально поддерживает любое количество баз данных, поэтому использование этих функций может сделать ваше приложение привязанным к определенной БД.