В чем разница между этими двумя утверждениями и почему вы выбираете их? - PullRequest
4 голосов
/ 19 августа 2010

Я новичок на рельсах.И я пришел к пониманию двух разных способов вернуть один и тот же результат.

В чем разница между этими двумя?И в какой ситуации вам потребуется выбрать одно из другого?

Пример 1:

Object.find(:all).select {|c| c.name == "Foobar" }.size

Пример 2:

Object.count(:conditions => ['name = ?', 'Foobar'])

ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ :

Я бы очень хотел, чтобы я мог проголосовать за все правильные ответы за этот вопрос.Огромное спасибо.У меня только что было серьезное подтверждение рельсов.

Ответы [ 4 ]

4 голосов
/ 19 августа 2010

Пример 1:

Это создает запрос:

SELECT * FROM objects

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

Пример 2:

Это создает запрос:

SELECT count(id) FROM objects WHERE name = 'Foobar'

позволяет sql выполнять всю тяжелую работуи возвращает только целое число - число объектов, удовлетворяющих условию.

Обычно вам не нужно 2 - быстрее и меньше памяти

4 голосов
/ 19 августа 2010

Object.count всегда попадает в БД, и вызов find () .... size () может оптимизировать. Хорошая дискуссия здесь

http://rhnh.net/2007/09/26/counting-activerecord-associations-count-size-or-length

2 голосов
/ 19 августа 2010

Пример 1 загрузит все ваши записи из БД (при условии, что Object является моделью ActiveRecord), затем использует Ruby для уменьшения набора и затем вернет размер этого массива.Таким образом, это может привести к большой нагрузке на память и ЦП - не хорошо.

В примере 2 подсчет выполняется в SQL, поэтому вся тяжелая работа выполняется в базе данных, а не в Ruby.Гораздо лучше :) 1003 *

2 голосов
/ 19 августа 2010

В примере 1 вы получаете все объекты из хранилища данных, а затем перебираете их все, выбирая объекты с именем Foobar. А затем получить размер этого массива. Пример 1 - явный проигрыш.

Пример 1 sql:

select * from whatever
# then iterate over entire array

Пример два выполняет предложение where в SQL для хранилища данных.

select count(id) from whatever where name = 'foobar'
# The SQL above is sql-server accurate, but not necessarily mysql or sqlite3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...