Невозможно обновить базу данных внутри цикла ruby

110
15

Этот код отображает регистрацию, в которой отображаются данные.

 cids.each {|c_array|
puts c_array[0]
signup = Signup.first(:customer_id => c_array[0])
#signup.created_at = c_array[1]
puts "signup is " + signup.inspect
#signup.update!
}

Результат:

signup is #<Signup @id=1 @user_id=1 @customer_id=74843293 @company_id=6 @created_at=Thu, 08 Jan 2015 22:21:43 -0500 @updated_at=Thu, 08 Jan 2015 22:21:43 -0500>

signup is #<Signup @id=2 @user_id=1 @customer_id=67170279 @company_id=6 @created_at=Thu, 08 Jan 2015 22:21:43 -0500 @updated_at=Thu, 08 Jan 2015 22:21:43 -0500>

signup is #<Signup @id=3 @user_id=1 @customer_id=69079324 @company_id=6 @created_at=Thu, 08 Jan 2015 22:21:44 -0500 @updated_at=Thu, 08 Jan 2015 22:21:44 -0500>

signup is #<Signup @id=4 @user_id=1 @customer_id=60434274 @company_id=6 @created_at=Thu, 08 Jan 2015 22:21:44 -0500 @updated_at=Thu, 08 Jan 2015 22:21:44 -0500>

И так далее.

Но когда я раскомментирую две другие строки:

 cids.each {|c_array|
puts c_array[0]
signup = Signup.first(:customer_id => c_array[0])
signup.created_at = c_array[1]
puts "signup is " + signup.inspect
signup.update!
}

Это ломает:

NoMethodError - undefined method 'created_at=' for nil:NilClass:
customerController.rb:49:in 'block (2 levels) in <class:CustomerController>'

Есть идеи?

спросил(а) 2015-01-14T06:34:00+03:00 5 лет, 10 месяцев назад
1
Решение
73

Похоже, вы не всегда Signup с customer_id из вашего массива, а иногда она возвращает nil вместо Signup объекта. Просто добавьте следующую проверку:

cids.each do |c_array|
puts c_array[0]
signup = Signup.first(:customer_id => c_array[0])
puts "signup is " + signup.inspect
unless signup.nil?
signup.created_at = c_array[1]
signup.update!
end
end

ответил(а) 2015-01-14T08:05:00+03:00 5 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема