gpt4 book ai didi

ruby-on-rails - ActiveRecord 的 find 方法是否会在其参数上自动调用 to_i?

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:50 24 4
gpt4 key购买 nike

我得出的结论是 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

当我运行上面的代码时,虽然我知道 task_src_ids 参数包含诸如“78,79”之类的内容,但只处理了与第一个 src_id 关联的记录。仔细想想,find 一定是在该字符串上调用 to_i,它将忽略第一个非数字后的所有内容并返回 78。

如果 find 没有调用 to_i 应该会导致错误,我将不得不显式调用 to_i。当然,我通过调用“split(',')”修复了代码,现在它处理多个 task_src_id,而不仅仅是第一个逗号之前的那个。

我知道我自己已经回答了这个问题,但作为一个 Ruby/Rails 新手,我正在寻找确认和相关文档的链接,而且我认为它可以在未来帮助其他人。提前致谢

最佳答案

[用activerecord-2.3.14代码回答这个问题,因为你没有指定版本。]

最终,您的值将通过 Quoting#quote 方法运行。我已经在此处粘贴了它的开头,正如您在第 15 行开始的 block 中看到的那样,当您的列类型为 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

关于ruby-on-rails - ActiveRecord 的 find 方法是否会在其参数上自动调用 to_i?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com