Ruby 帮忙优化一段代码

gihnius · 2013年04月15日 · 最后由 zgm 回复于 2013年04月15日 · 1878 次阅读

def insert(hash)
  cols = ""
  vals = ""
  hash.each do |c,v|
    unless v.nil?
      cols << "#{c},"
      if v.is_a?(String)
        vals << "'#{PGconn.escape(v)}',"
      else
        vals << "#{v},"
      end
    end
  end
  vals.gsub!(/,$/, '')
  cols.gsub!(/,$/, '')
  sql = "INSERT INTO twitter_users(#{cols}) VALUES(#{vals});"
  #puts_and_return sql
  begin
    db.async_exec sql
  rescue PG::Error => e
    puts "Oops... >>> in #{hash} : #{e}"
  end
end

table 已确保可以容纳 hash 这种情况在 ruby2 我会用 Struct.

这个方法有什么不妥之处,或者有没有更好的方法?

def insert(hash)
  hash.delete_if { |_, v| v.nil? }

  cols = hash.keys.join(',')
  vals = hash.values.map { |v| v.is_a?(String) ? PGconn.escape(v) : v }.join(',')

  sql = "INSERT INTO twitter_users(#{cols}) VALUES(#{vals});"

  begin
    db.async_exec sql
  rescue PG::Error => e
    puts "Oops... >>> in #{hash} : #{e}"
  end
end

PS: 没有用 ActiveRecord?

columns 不确定的话,是不是没法防止 sql 注入?

#2 楼 @keating 如果没有对外开放接口的话,问题应该不大。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号