将串联的“列表”从 php 转换为 ruby


Convert concatenated "list" from php to ruby

我不知道如何在红宝石上做同样的事情:

在 php 中,我可以使用以下结构:

while ((list($r_key, $r_value) = each($rule_arr)) 
        && (list($v_key, $v_value) = each($value_arr)) 
        && (list($s_key, $s_value) = each($stack_arr)))
      {
          $insert_rules_for_types = sprintf("INSERT INTO                  
                  `rules_for_types`(`types_id`, `rules_id`, `value`, `stackcount`) 
                   value('%d','%d','%d','%d')", intval($type_id), intval($r_value), 
                   intval($v_value), intval($s_value));
      commit_changes($insert_rules_for_types);
}

如何在红宝石上做同样的事情?

它的相当字面的重写将是这样的:

rule_arr.each do |r_key, r_value|
  value_arr.each do |v_key, v_value|
    stack_arr.each do |s_key, s_value|
      insert_rules_for_types = "INSERT INTO `rules_for_types`(`types_id`,`rules_id`,`value`,`stackcount`) value('%d','%d','%d','%d')" % [
        type_id.to_i,
        r_value.to_i,
        v_value.to_i,
        s_value.to_i
      ]
      commit_changes(insert_rules_for_types)
    end
  end
end

无论你在PHP中做什么,你都可以通过使用ORM来避免构建SQL的很多混乱,比如范围非常广泛的ActiveRecord,或者Sequel,它更轻巧,更面向插件。

如果使用得当,这两种方法都将确保您正确转义 SQL。转换为整数是弱转义的标志,因为它不是通用解决方案。

Sequel 有一个 Ruby 接口可以调用许多 SQL 调用,因此INSERT映射为一些简单的代码:

db[:rules_for_types].insert(
  :types_id => types_id,
  :rules_id => rules_id,
  :value => v_value,
  :stackcount => s_value
)

这样做使得很难将未转义的值注入到查询中。

我认为你可以使用Ruby的%。有关详细信息,请查看此内容。