“转换连接的”;列表“;从php到ruby

“转换连接的”;列表“;从php到ruby,php,ruby,Php,Ruby,我不知道如何在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_fo

我不知道如何在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);
}

我怎样才能在ruby上做同样的事情呢?

我想你可以使用ruby的%。查看详细信息。

对其进行相当文字化的重写如下:

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(比如范围非常广泛的ORM,或者更轻、更面向插件的ORM)来避免构建SQL的麻烦

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

Sequel有一个Ruby接口来支持许多SQL调用,因此
INSERT
映射为一些直接的代码:

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

这样做会很难将未替换的值注入到查询中。

很抱歉,我认为您不理解这个问题,它不是字符串连接,而是“列表”连接。这部分:虽然((list($r_key,$r_value)=每个($rule_arr))&(list($v_key,$v_value)=每个($value_arr))&($list($s_key,$s_value)=每个($stack_arr)),我知道如何为一个列表创建它:rule_arr。每个{rule | r| key,r_value=rule}-它确实很简单,但我不知道如何在一瞬间做3次哈希。