Подтвердить что ты не робот

Размер, длина и количество в Rails

1.9.3p194 :002 > u = User.find_by_email("[email protected]")
1.9.3p194 :005 > u.addresses.size
 => 1 
1.9.3p194 :006 > u.addresses.length
 => 1 
1.9.3p194 :007 > u.addresses.count 

Нет разницы между размером, длиной и количеством в Rails 3.2.3, не так ли?

4b9b3361

Ответ 1

длина будет загружать все ваши объекты только для их подсчета; что-то вроде:

select * from addresses...

а затем верните результат. Как вы можете себе представить - это плохая производительность

count просто выдает

select count(*) from addresses...

что лучше, потому что мы не загружаем все адреса только для их подсчета

размер умнее - он проверяет, уже ли уже установлена ​​ассоциация, и если true, то верните длину (без вызова вызова в базу данных).

размер также проверяет counter_cache, если в вашей модели пользователя есть поле с именем address_count, тогда размер будет использовать это поле для подсчета, поэтому нет необходимости выдавать счет в таблице адресов.

Если все не удается, размер выдаст select count(*) в базе данных

Ответ 2

Если "адреса" - это ассоциация, которая выглядит так, то они разные, но они должны возвращать тот же результат.

#count предоставляется ActiveRecord и будет выполнять что-то вроде "select count (*) из адресов, где user_id =".

В других случаях #addresses будет создавать массив, содержащий фактические объекты модели, а #size и #length предоставляются классом Array или, возможно, Enumerable.

Так что #count, вероятно, быстрее, потому что подсчет происходит в базе данных. Не очень хорошо, если вам действительно нужны адреса tho:)

Ответ 3

1) В rails count используется метод ActiveRecord, поэтому счет можно применить к имени модели непосредственно как:

> User.count
   (1.4ms)  SELECT COUNT(*) FROM "users"
=> 1

Но размер не является методом ActiveRecord, поэтому он выдает ошибку

> User.size
"NoMethodError".

2) Размер в рельсах может использоваться с массивом ActiveRecord (т.е. размер - это метод Array)

> User.all.size
   (1.2ms)  SELECT COUNT(*) FROM "users"
=> 1 

3) count всегда будет запускать запрос ActiveRecord. но размер не будет запускать запрос ActiveRecord, только если массив записей или ActiveRecord уже загружен (выполнен) как:

  > d=User.all
  User Load (18.1ms)  SELECT "users".* FROM "users"
 => #<ActiveRecord::Relation [#<User id: 1, email: "[email protected]", name: "mano", dob: "2017-02-16", address: "fasfafasf", created_at: "2017-02-12 08:16:12", updated_at: "2017-02-12 09:34:07", online: false>]> 
2.3.3 :009 > 
2.3.3 :010 >   d.count
   (1.3ms)  SELECT COUNT(*) FROM "users"
 => 1 
2.3.3 :011 > d.size
 => 1