Что не так с кодом, подобным User.find (: all) .each? - PullRequest
3 голосов
/ 07 мая 2009

Я только что прочитал это требование в списке вакансий:

Осознавая ловушки кода, такие как: User.find(:all).each

Я сразу понял, что я не годен для работы, потому что я не понимаю, в чем проблема. Это ...

  • дизайн связан? Должен ли я сохранить запрос к базе данных в переменной и , затем повторить его?
  • опасно?
  • слишком многословно? Должен ли я использовать User.all.each вместо этого? (-1 слово! W00t!)
  • просто плохо сформулирован? Должно ли оно иметь предисловие «Таблица пользователей содержит 3 миллиона строк»?

Ответы [ 5 ]

7 голосов
/ 07 мая 2009

Я думаю, что «ловушка», которую они ищут, заключается в том, что когда кто-то пишет User.all.each, он обычно выглядит так:

User.all.each do |u|
    next if !u.is_active
    ...
end

означает, что фильтрация происходит в Ruby после загрузки всего содержимого каждого из этих объектов из БД, когда фильтрацию можно было бы сделать гораздо эффективнее, выразив требуемое свойство как часть запроса.

5 голосов
/ 07 мая 2009

Выполнение User.all загрузит все записи пользователя. Если у вас есть 3 миллиона записей, он загрузит все 3 миллиона объектов. Вот почему это плохая идея. Лучше всего отфильтровать ваш SQL с помощью таких методов, как разбиение на страницы или условия, чтобы получить наименьшее подмножество, необходимое для "выполнения работы"

2 голосов
/ 07 мая 2009

Это многословно? Вы можете сделать то же самое с User.all.each? (-1 слово! W00t!)

Мы ценим краткость в стране рубина. Я, например, голосую за внедрение Model.each, теперь, когда вы заставили меня рассмотреть его.

Это просто плохо сформулировано? Должен ли он иметь предисловие «Таблица пользователей содержит 3 миллиона строк» ​​

Я считаю, что это самый разумный ответ. Возможно, вы загружаете много записей в память.

Я бы сказал, что проблема не столько в том, что в пользовательской таблице бывает 3м записи, но в том, что она может появиться в разумные сроки.

1 голос
/ 29 августа 2012

Это ловушка, я не являюсь носителем английского языка, но я понимаю, что это не непосредственный недостаток, но это дыра в земле, о которой вам следует опасаться. Делать это так, как на будущее -

User.find_in_batches do |group|
  group.each do |user|
    user.do_something
  end
end

Даже если вы выросли с 1 пользователя до 10 миллионов в неделю.

0 голосов
/ 07 мая 2009

Что ж, если вы хотите выглядеть умно, ответьте: в этом вопросе нет подводных камней, если вы хотите изменить или отобразить значения для каждого из пользовательских объектов. : -)

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