2016-12-14 2 views
1

Я схожу с ума, пытаясь заставить это работать. Я хочу, чтобы петли через jointable называется TriggersUser, чтобы увидеть, где пользователь не имеет Trigger запись (есть только 3 триггеров они могут иметь)Rails: Найти, где ассоциация не существует и объявить переменную

if current_user.triggers.any? 
    (1..2).each do |n| 
    if !current_user.triggers.find(n) 
     @next_trigger = Trigger.find(n) 
    else 
     @next_trigger = Trigger.find(3) 
    end 
    end 
end 

Я получаю эту ошибку: Couldn't find Trigger with 'id'=1 [WHERE "triggers_users"."user_id" = ?]

, который отлично, потому что пользователь не имеет связанной записи с trigger_id 1 в таблице соединений. НО, я хочу, чтобы теперь объявить переменную @next_trigger = Trigger.find (1)

Что мне не хватает?

TY !!

+1

Почему вы не используете 'find_by_id' вместо' find'? 'find_by_id' возвращает' nil', когда запись не существует для данного идентификатора, поэтому в вашем случае это будет '@next_trigger = nil' – dp7

+1

OMG. Яс! Пожалуйста, добавьте в качестве решения, чтобы я мог принять. Почему это работает вместо поиска, если find ищет идентификатор? – gwalshington

ответ

2

Вы должны использовать find_by_id вместо find.

find_by_id просто возвращает nil, если запись не существует для заданного идентификатора.

Если вы используете find, вам необходимо обработать исключение. Вы можете сделать это:

@next_trigger = Trigger.find(n) rescue nil 
+0

И уточнить - find ничего не возвращает и выдает ошибку? Почему «спасать ноль», если он не возвращает нуль, как вы говорите, find_by_id делает? – gwalshington

+1

'rescue' будет обрабатывать исключение и возвращать' nil' каждый раз 'find' не находит id. – dp7

+0

Большое спасибо за объяснение! – gwalshington