Вы можете использовать регулярные выражения. Вот функция с предложениями @ janm.
class String
def is_i?
!!(self =~ /\A[-+]?[0-9]+\z/)
end
end
Отредактированная версия в соответствии с комментарием от @wich:
class String
def is_i?
/\A[-+]?\d+\z/ === self
end
end
Если вам нужно только проверить положительные числа
if !/\A\d+\z/.match(string_to_check)
#Is not a positive number
else
#Is all good ..continue
end
Для получения копии используйте клон (или дубликат для направляющих 3.1) метод:
# rails < 3.1
new_record = old_record.clone
#rails >= 3.1
new_record = old_record.dup
Тогда можно измениться, какой бы ни поля Вы хотите.
ActiveRecord переопределяет встроенный Object#clone, чтобы дать Вам новое (не сохраненный к DB) запись с неприсвоенным идентификатором.
Примечание, что это не копирует ассоциации, таким образом, необходимо будет сделать это вручную, если Вы должны.
направляющие 3,1 клона являются мелкой копией, используйте дубликат вместо этого...
В зависимости от Ваших потребностей и стиля программирования, можно также использовать комбинацию нового метода класса и слияния. Из-за отсутствия лучшего простой пример, предположите, что Вам запланировали задачу для определенной даты, и Вы хотите копировать его на другую дату. Фактические атрибуты задачи не важны, таким образом:
old_task = Task.find(task_id) new_task = Task.new(old_task.attributes.merge({:scheduled_on => some_new_date}))
создаст новую задачу с :id => nil
, :scheduled_on => some_new_date
, и все другие атрибуты то же как исходная задача. Используя Task.new, необходимо будет явно звонить, сохраняют, поэтому если Вы хотите сохраненный автоматически, изменяете Task.new на Task.create.
Мир.
Я обычно просто копирую атрибуты, изменяясь независимо от того, что мне нужно изменение:
new_user = User.new(old_user.attributes.merge(:login => "newlogin"))