User.where(:pic.exists => true).all.each &:update
Это медленно, потому что .all.each
загружает всех подходящих пользователей в память, find_each
немного более эффективно использует память, так как загружается партиями, но это все равно пустая трата времени и память для загрузки каждого объекта в память и превращения его в объект для копирования одного атрибута. Затем он запускает update
для каждого отдельного.
Вместо этого вы можете сделать это полностью в базе данных в одном запросе.
Если намерение состоит в копировании из * От 1012 * до User.image_url
, вы можете сделать это одним оператором.
# Find all the users who do not already have an image_url set
User.where(image_url: nil)
# Set their image_url to be their pic.
.update_all("image_url = pic")
Это запустит один запрос:
update users
set image_url = pic
where image_url is null
Нет необходимости также проверять пользователей, которые не хватает pic
, потому что установка nil на nil не повредит, а более простой поиск может быть быстрее. Но если вам нравится чек, вы можете использовать where.not
. Users.where(image_url: nil).where.not(pic: nil)