#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
, пустых строк, пустых массивов и так далее… Я еще раз скорректирую свой ответ: D3. Ты гений, это сработало! Спасибо, что уделили мне время!!!
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
никогда не будет вызвана.