Метод ActiveRecord автоматически вызывает to_i для своего аргумента? - PullRequest
3 голосов
/ 23 сентября 2011

Я пришел к выводу, что ActiveRecord автоматически вызывает to_i для своего аргумента, но был бы признателен, если бы кто-нибудь смог подтвердить, особенно через ссылку на некоторую документацию.

То, как я пришел к выводу, лучше всего иллюстрируется следующим примером кода:

dest_task = WorkEffort.find(params[:task_dest_id])

params[:task_src_ids].split.each do |src_id|
    WorkEffort.find(src_id).move_to_child_of dest_task
end

Когда я запускал вышеупомянутое, только запись, связанная с первым src_id, была обработана, хотя я знал, что параметр task_src_ids содержал что-то вроде "78,79". Обдумывая это, find должен вызвать to_i в этой строке, которая будет игнорировать все после первой нецифровой цифры и вернуть 78.

Если find не вызывал to_i, должна была возникнуть ошибка, и мне пришлось бы явно вызывать to_i. Я, конечно, исправил код, вызвав «split (',')», и теперь он обрабатывает несколько task_src_ids вместо того, который стоит перед первой запятой.

Я знаю, что вроде как ответил на это сам, но как новичок в Ruby / Rails я ищу подтверждение и ссылку на соответствующую документацию, плюс я подумал, что это может помочь другим в будущем. Заранее спасибо

1 Ответ

2 голосов
/ 23 сентября 2011

[Отвечая на это с помощью кода activerecord-2.3.14, поскольку вы не указали версию.]

В конечном итоге ваше значение будет проверяться с помощью метода Quoting#quote.Я вставил начало этого здесь, и как вы можете видеть в блоке, начинающемся со строки 15, когда ваш тип столбца равен int, он в конечном итоге вызовет .to_i для переданного значения.

  1 module ActiveRecord
  2   module ConnectionAdapters # :nodoc:
  3     module Quoting
  4       # Quotes the column value to help prevent
  5       # {SQL injection attacks}[http://en.wikipedia.org/wiki/SQL_injection].
  6       def quote(value, column = nil)
  7         # records are quoted as their primary key
  8         return value.quoted_id if value.respond_to?(:quoted_id)
  9           
 10         case value
 11           when String, ActiveSupport::Multibyte::Chars
 12             value = value.to_s
 13             if column && column.type == :binary && column.class.respond_to?(:string_to_binary)
 14               "'#{quote_string(column.class.string_to_binary(value))}'" # ' (for ruby-mode)
 15             elsif column && [:integer, :float].include?(column.type)
 16               value = column.type == :integer ? value.to_i : value.to_f
 17               value.to_s
 18             else
 19               "'#{quote_string(value)}'" # ' (for ruby-mode)
 20             end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...