Этот код должен обновить всю таблицу, применив фильтр к ее значениям "name":
entries = select('id, name').all
entries.each do |entry|
puts entry.id
update(entry.id, { :name => sanitize(entry.name) })
end
Я довольно новичок в Ruby on Rails и мне было интересно, что мой запрос на выборку разбит на выборки из одной строки:
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 1) LIMIT 1
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 2) LIMIT 1
SELECT `entries`.* FROM `entries` WHERE (`entries`.`id` = 3) LIMIT 1
...
Как я понимаю, это своего рода оптимизация, предоставляемая Rails - выбирать строку только тогда, когда это необходимо (каждый цикл), а не все записи сразу.
Однако действительно ли это более эффективно в этом случае? Я имею в виду, если у меня есть 1000 записей в моей таблице базы данных - лучше ли сделать 1000 запросов, чем один? Если нет, как я могу заставить Rails выбирать более одной строки на запрос?
Другой вопрос: не все строки обновляются по этому запросу. Не игнорирует ли Rails запрос на обновление, если указанные значения совпадают с уже существующими (другими словами, если entry.name == sanitize (entry.name))?