В чем разница между использованием .Exists?, И. Представляют? в рубине? -- ruby-on-rails поле с участием ruby пол Связанный проблема

What is the difference between using .exists?, and .present? in Ruby?


52
vote

проблема

русский

Я хочу убедиться, что я использую их для правильного случая и хотите знать любые тонкости. Кажется, они функционируют одинаково, что нужно проверить, было ли определено ли поле объекта, когда я использую их через консоль, и нет никакой информации о сети онлайн, когда я сделал поиск Google. Спасибо!

Английский оригинал

I want to make sure I'm using them for the correct occasion and want to know of any subtleties. They seem to function the same way, which is to check to see if a object field has been defined, when I use them via the console and there isn't a whole lot information online when I did a google search. Thanks!

</div
     
   
   

Список ответов

79
 
vote
vote
Лучший ответ
 

Чтобы уточнить: ни <код> present? ни <код> exists? - это «чистые» рубины - они оба из Rails-land.

настоящее?

<Код> present? - это расширение активации Object . Обычно используется в качестве теста на общую «фальсию» объекта. From Документация :

Объект <код> present Если это не <код> blank? . Объект <код> blank Если это <код> false , пустой или пробельная строка.

Так, например:

 <код> [ "", " ", false, nil, [], {} ].any?(&:present?) # => false   

существует?

<Код> exists? от activeeresource. From Его документация :

утверждает существование ресурса, возвращая True, если ресурс найден.

 <код> exists?0  
 

To clarify: neither present? nor exists? are "pure" ruby—they're both from Rails-land.

present?

present? is an ActiveSupport extension to Object. It's usually used as a test for an object's general "falsiness". From the documentation:

An object is present if it’s not blank?. An object is blank if it’s false, empty, or a whitespace string.

So, for example:

[ "", " ", false, nil, [], {} ].any?(&:present?) # => false 

exists?

exists? is from ActiveResource. From its documentation:

Asserts the existence of a resource, returning true if the resource is found.

Note.create(:title => 'Hello, world.', :body => 'Nothing more for now...') Note.exists?(1) # => true 
</div
 
 
 
 
25
 
vote

Большая разница между двумя методами, заключается в том, что при вызове <код> exists?1 Инициализирует ActiveERecord для каждой найденной записи (!), Пока <код> exists?2 не

Чтобы показать это, я добавил после_инициализации на пользователя. Он печатает: «Вы инициализировали объект!»

user. Где (имя: 'Майк'). Настоящее?

 <код> exists?3  

user.exists? (Имя: 'Майк')

 <код> exists?4  
 

The big difference between the two methods, is that when you call present? it initializes ActiveRecord for each record found(!), while exists? does not

to show this I added after_initialize on User. it prints: 'You have initialized an object!'

User.where(name: 'mike').present?

User Load (8.1ms) SELECT "users".* FROM "users" WHERE "users"."name" = $1 ORDER BY users.id ASC  [["name", 'mike']] You have initialized an object! You have initialized an object! 

User.exists?(name: 'mike')

User Exists (2.4ms)  SELECT 1 AS one FROM "users" WHERE "users"."name" = $1 ORDER BY users.id ASC LIMIT 1  [["name", 'mike']] 
</div
 
 
16
 
vote

Есть огромная разница в производительности, а <код> exists?5 может быть до 10x медленнее, чем <код> exists?6 в зависимости от отношения, вы проверяете.

Эта статья Тесты <Код> exists?7 против <код> exists?8 vs <код> exists?9 и объясняет, почему они переходят от медленного до быстрой, в этом порядке.

в двух словах, <код> present?0 ( 900ms в примере ) загрузит все записи, возвращенные, <код> present?1 ( 100ms в примере ) будет использовать sqlcount, чтобы увидеть, если это & ​​gt; 0 и <код> present?2 ( 1ms в примере ) - смарт-малыш, который использует ограничение 1 SQL, чтобы просто проверить, есть хотя бы одна запись, не загружая их всех не подсчитание их всех Отказ

 

There is a huge difference in performance, and .present? can be up to 10x slower then .exists? depending on the relation you are checking.

This article benchmarks .present? vs .any? vs .exists? and explains why they go from slower to faster, in this order.

In a nutshell, .present? (900ms in the example) will load all records returned, .any? (100ms in the example) will use a SQLCount to see if it's > 0 and .exists? (1ms in the example) is the smart kid that uses SQL LIMIT 1 to just check if there's at least one record, without loading them all neither counting them all.

</div
 
 
   
   
8
 
vote

<Код> present?3 сканирует записи, чтобы получить счет.

<Код> present?4 остановится после первого матча, поэтому их время exec будет очень отличаться.

 

SELECT COUNT(*) would scan the records to get a count.

SELECT 1 would stop after the first match, so their exec time would be very different.

</div
 
 
2
 
vote

SQL, генерируемый двумя, также разные.

<Код> present?5 :

 <код> present?6  

<Код> present?7 :

 <код> present?8  

Они оба, кажется, управляют такой же скоростью, но могут варьироваться в зависимости от вашей ситуации.

 

The SQL generated by the two are also different.

present?:

Thing.where(name: "Bob").present? # => SELECT COUNT(*) FROM things WHERE things.name = "Bob"; 

exists?:

Thing.exists?(name: "Bob") # => SELECT 1 AS one from things WHERE name ="Bob" limit 1; 

They both seem to run the same speed, but may vary given your situation.

</div
 
 
-3
 
vote

Вы можете избежать запроса базы данных, используя <код> present?9 :

 <код> Object0  
 

You can avoid database query by using present?:

all_endorsements_11 = ArtworkEndorsement.where(user_id: 11) ArtworkEndorsement Load (0.3ms)  SELECT "artwork_endorsements".* FROM "artwork_endorsements" WHERE "artwork_endorsements"."user_id" = $1  [["user_id", 11]] all_endorsements_11.present? => true  all_endorsements_11.exists? ArtworkEndorsement Exists (0.4ms)  SELECT  1 AS one FROM "artwork_endorsements" WHERE "artwork_endorsements"."user_id" = $1 LIMIT 1  [["user_id", 11]] => true  
</div
 
 

Связанный проблема

0  Ошибка обновления записи  ( Error updating a record ) 
Я получаю ошибку mysql: #update (ActiveReCord :: authentInvalid) "mysql :: Ошибка: # hy 000got Ошибка 139 из механизма хранения: При попытке обновить те...

1  FXCOP / STYLECOP Equivalent для Ruby на рельсах?  ( Fxcop stylecop equivalent for ruby on rails ) 
Есть ли какие-либо инструменты анализа статического кода для Ruby на рельсах? Я ищу что-то на линии «тесты VS-анализа кода», а также анализ на основе правил, ...

4  JSON и CARIONWAVE IPHONE проблема [закрыто]  ( Json and carrierwave iphone problem ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

1  Логические ценности не "читают" в рельсах  ( Boolean values not being read in rails ) 
Я импортировал некоторые значения из Excel, используя ROO на логические поля в моем приложении Rails. В консоль рельсов Похоже, что все работает нормально, ...

3  Как сделать одинаковую страницу 404 для всех неизвестных запросов, включая изображения, в Rails 3.2, не указав каждый формат файла индивидуально?  ( How to render the same 404 page for all unknown requests including images in r ) 
Мы используем следующий путь в маршрутах в маршрутах .rb на 404S: <код> # Catches all 404 errors and redirects match '*url' => 'default#error_404' Но эт...

0  Rails find_by_sql Не возвращая результаты  ( Rails find by sql not returning results ) 
Так что мой запрос, который я бегу, возвращает массив с идентификатором и ничего больше. Но когда я бегу один и тот же запрос в PSQL, он возвращает правильные...

3  Подавить ошибку при сохранении записи в рельсах  ( Suppress an error when saving a record in rails ) 
Я сохраняю данные в таблицу. <код> Question title:string author_id:integer description:text upvotes:integer Если значение «question.upvotes» сос...

0  Маршрутизация поддоменов в рельсах и главном участке  ( Subdomain routing in rails and main site ) 
Я пытаюсь установить следующее: www.domain.com идет на главный сайт (пользователь может зарегистрироваться, информацию о приложении) foo.domain.com отправ...

260  Rails: update_attribute vs update_attributes  ( Rails update attribute vs update attributes ) 
<код> Object.update_attribute(:only_one_field, "Some Value") Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3") Оба из...

7  Rails: Размер кеша в файле управления  ( Rails control file store cache size ) 
Документация для кэша на основе файлов в Rails говорит: Обратите внимание, что кеш будет расти, пока не будет заполнен диск, если вы не Периодически очищ...

0  Ruby On Rails - Включение клиента скачать видео  ( Ruby on rails enabling client to download videos ) 
Требование - у меня есть видео, размещенное на моем сервере, пользователь должен быть в состоянии загрузить файл, нажав на ссылку. Я следую инструкциям, при...

10  Какой правильный способ запуска одного контроллера действия от другого действия контроллера без перенаправления HTTP?  ( Whats the correct way to run one controller action from another controller acti ) 
Я хотел бы иметь возможность отправлять из одного контроллера на другой условно, на основе комбинации параметров запросов и данных в базе данных. Что я имею...

6  Модели Activerecord кэшированы в заставленных граблях?  ( Activerecord models cached in rake tasks ) 
Я знаю, что в Rails 2.3.2 QuickeRecord запросы кэшированы, то есть вы можете увидеть что-то в журнале разработки / производства: <код> CACHE (0.0ms) SELEC...

1  Rails link_to запрос params - выбор в элементе на следующей странице  ( Rails link to query params selecting in item on the next page ) 
прямо сейчас у меня <код> link_to . Похоже на кнопку пользователю. Это кнопка обновления, поэтому он направляет пользователь на страницу планов. Я не только...

6  Готовая загрузка полиморфных ассоциаций в ActiveSerecord  ( Eager loading of polymorphic associations in activerecord ) 
Это мой первый раз, используя Rails, и мне было интересно, если можно загрузить одну полиморфную ассоциацию в одном запросе SQL? Модели и ассоциации между ним...

Связанный проблема

0  Ошибка обновления записи 
1  FXCOP / STYLECOP Equivalent для Ruby на рельсах? 
4  JSON и CARIONWAVE IPHONE проблема [закрыто] 
1  Логические ценности не "читают" в рельсах 
3  Как сделать одинаковую страницу 404 для всех неизвестных запросов, включая изображения, в Rails 3.2, не указав каждый формат файла индивидуально? 
0  Rails find_by_sql Не возвращая результаты 
3  Подавить ошибку при сохранении записи в рельсах 
0  Маршрутизация поддоменов в рельсах и главном участке 
260  Rails: update_attribute vs update_attributes 
7  Rails: Размер кеша в файле управления 
0  Ruby On Rails - Включение клиента скачать видео 
10  Какой правильный способ запуска одного контроллера действия от другого действия контроллера без перенаправления HTTP? 
6  Модели Activerecord кэшированы в заставленных граблях? 
1  Rails link_to запрос params - выбор в элементе на следующей странице 
6  Готовая загрузка полиморфных ассоциаций в ActiveSerecord