ActiveRecord:: Проблема с отношением проверяется на ноль? — Rails 3.1

#ruby-on-rails #ruby #ruby-on-rails-3 #ruby-on-rails-3.1

#ruby-on-rails #ruby #рубин-на-рельсах-3 #ruby-on-rails-3.1 #ruby-on-rails-3

Вопрос:

В следующем запросе я получаю объекты в качестве возвращаемого значения (и, таким образом, проверяю отсутствие результатов с помощью .nil? работает просто отлично:

   store = Store.where(:some_id => myobj.some_id.to_i).first
  unless store.nil?
  

Но в этом следующем коде я получаю возвращаемый тип ActiveRecord::Relation и проверяю с помощью .nil? сбой!

 existing_store = Store.where(:some_str => myobj.some_str).not_hidden().active()
if existing_store.nil?
  

1. Почему это?

2. Как я могу проверить отсутствие результатов в этом случае?

3. Как я мог бы проверить, не возвращаются ли записи вообще при использовании find() или where()

Rails 3.1 действительно сделал это запутанным.

Комментарии:

1. not_hidden и active являются ли области, которые я предполагаю? И что именно возвращает вызов #nil? ?

2. да, это области… и вызов .nil? всегда равно false, потому что возвращаемое значение является пустым массивом (и, следовательно, никогда не равно нулю)

3. Как уже предлагалось ниже, я бы использовал #empty? тогда.

4. Для обоих случаев или только когда возвращаемый тип ActiveRecord::Relation ?

5. На мой взгляд, использование #where только для ситуаций, в которых вы хотите найти несколько записей. Если да, проверьте с помощью #empty? . Если вы хотите найти единственную запись, используйте #first и проверяйте с nil? помощью.

Ответ №1:

используйте blank? , nil? верно, если это действительно nil (единственный экземпляр NilClass ), но ваш второй пример всегда будет возвращать массив, возможно, пустой, если результатов нет, но, тем не менее, массив. blank? проверяет наличие пустых массивов, пустых строк, нулевых и ложных значений.

Если у вас возникли проблемы с blank? неправильным поведением, вы можете проверить first.nil?

Комментарии:

1. После тщательного тестирования, blank? и наоборот present? , оказались лучшими вариантами для тестирования возвращаемых значений для активной записи.

Ответ №2:

Потому что в первом случае вы пытаетесь проверить экземпляр во втором, который вы получили, Array а массива нет nil , его Array даже если он пустой. Вы должны использовать empty? , чтобы проверить это!

Комментарии:

1. но я получаю массив, даже если я делаю .first() во втором запросе.

2. Действительно, что возвращается при попытке Store.where(:some_str => myobj.some_str).first.class ?

3. ActiveRecord::Отношение — я использую rails 3.1