Как установить случайное число перед сохранением для модели?

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-4 #ruby-on-rails-5

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-4 #ruby-on-rails-5

Вопрос:

У меня есть Produt model, что если пользователь оставил поле пустым, мне нужно сгенерировать случайное число. Как я могу этого добиться?

   def self.set_random_number()
   if self.code == null
    self.code.rand(1000..99999)
   end
  end
  

Я попробовал этот метод и вызвал before_save :set_random_number(). Но это не работает. Не могли бы вы, ребята, пожалуйста, помочь мне?

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

1. Из любопытства, code должно ли оно быть уникальным во всех экземплярах Product ?

2. Да! Теперь я начинаю думать об этой проблеме.

3. code Предназначено ли оно для удобства пользователя? Если нет, вы могли бы рассмотреть возможность использования UUID.

4. Да, к сожалению, это должно быть удобным для пользователя. Я не имею дело с большим количеством продуктов, поэтому я думаю, что я буду рандомизировать примерно 1000 .. 1000000, так что шансы получить то же самое число равны нулю. Не лучшее решение, но я думаю, оно сработает.

Ответ №1:

Вы не присваиваете номер randon в модели, измените свой метод на этот:

 before_save :set_random_number

def set_random_number
 self.code = rand(1000..99999) if self.code.blank?
end
  

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

1. Итак, я внес это изменение. Но теперь я получаю «неопределенный метод `set_random_number’ для #<Product:0x00007fd2f7c31cf8>», когда он выполняет действие ‘create’ на контроллере Products. Как я могу это решить?

2. Может случиться так, что если вы оставите поле для code пустым, то пустые строки будут передаваться через параметры, так что тогда холодное поле будет не nil, а "" . Итак, здесь нам нужно изменить оператор if в методе на, .blank? который является истинным для nil , пустых строк, пустых массивов и так далее… Я еще раз скорректирую свой ответ: D

3. Ты гений, это сработало! Спасибо, что уделили мне время!!!

4. Хорошие ответы, Клара! И многие правки часто полезны!

5. Рад помочь. Спасибо @jvillian, но обычно я ожидаю, что сам уловлю такие мелочи, как null и круглые скобки. Спасибо за вашу помощь!

Ответ №2:

Попробуйте следующее:

 before_save :set_random_number

def set_random_number
  return if code.present?

  self.code = rand(1000..99999)
end
  

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

1. Я полагаю, вы обнаружите, читая комментарии к ответу Клары, что значение устанавливается в пустую строку. Итак, это не сработает, верно? Потому что пустая строка будет оценена как отличная от нуля и rand никогда не будет вызвана.