Эффективность Ruby on Rails ActiveRecord - PullRequest
1 голос
/ 24 января 2011

Этот код должен обновить всю таблицу, применив фильтр к ее значениям "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))?

Ответы [ 2 ]

2 голосов
/ 24 января 2011

ActiveRecord - это уровень абстракции, но при выполнении определенных операций (особенно операций с большими наборами данных) полезно знать, что происходит под уровнем абстракции.

Это в значительной степени верно для всех абстракций.(см. классическую статью Джоэла Спольски о неплотных абстракциях: http://www.joelonsoftware.com/articles/LeakyAbstractions.html)

Чтобы разобраться в данном случае, Rails предоставляет метод update_all

1 голос
/ 24 января 2011
Entry.find_each do |entry|
  #...
end

Это выбирает все записи (100 за запрос) и выставляет каждую запись для вашего удовольствия.

Если атрибуты не изменены, Rails не будет выполнять запрос UPDATE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...