2013-04-23 3 views
1

Возвращает ли пустой массив или значение nil, если условие ложно? Например:Где метод, если условие ложно

@result=Result.where(:test_id=>test_id, :user_id => current_user.id).first 

, если не существует никакого результата с такой test_id и user_id.

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

ответ

3

Ваша переменная из двух частей, первая часть возвращает ActiveRecord::Relation (который существенно массив):

@result_array = Result.where(:test_id=>test_id, :user_id => current_user.id) 

> @result_array.class 
    => ActiveRecord::Relation 

, которая пуста (показывает, как []), если есть нет результатов.

Второй возвращает первый элемент, или (если это пустой массив) nil:

> (1..10).first 
=> 1 

> [].first 
=> nil 

@first_or_nil = @result = @result_array.first 

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

+0

Я думаю, что первая часть возвращает 'ActiveRecord :: Relation' –

+0

@Thahakp очень хорошая точка. –

0

Для решения этой проблемы вы можете использовать этот код.

@result=Result.where(:test_id=>test_id).(:user_id => current_user.id).first 
+0

Извините, но ваш ответ не отвечает на вопрос, что возвращает метод, если ничего не найдено. –

+0

вы можете проверить результат с помощью метода @ result.count. Он дает 0, если не найдены записи. –

+0

Но по какой-то причине он возвратил нуль вместо пустого массива, и такой синтаксис хорошо работал в других случаях, так что это не причина. Интересно, почему тогда? –

0

Thy использовать #bang методом .first ! Например:

@result=Result.where(:test_id=>test_id, :user_id => current_user.id).first! 

Она должна возвращать первый элемент капелька рубина встретится в таблице «результаты».
Это должно помочь.

+0

Не будет ли это вызывать ошибку, если в какой-то части не будет найдено никаких результатов? (а не 'nil') –

0

Вы также можете использовать этот простой запрос ...

@result=current_user.results.find_by_test_id(:test_id) 
Смежные вопросы