新手问题 Active Record 怎么做带参数的 insert

fsword · May 30, 2013 · Last by badboy replied at May 31, 2013 · 2587 hits

批量将数据转移到历史表,需要用 raw 的方式,但是我一直没搞定如何 execute,目前的做法是这样的:

dd = Product.first # 示例,将要转移的数据
attrs = dd.attributes.keys.map{|s| "`#{s}`"}.join ','

ActiveRecord::Base.connection.execute("insert into `history_products`(#{attrs}) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", dd.attributes.values)

然后报错——”Mysql2::Error: You have an error in your SQL syntax“

而不用动态参数的话是没有问题的

#1 楼 @xds2000 昨天也曾 google 到这个页面,不过我只是验证了一下 raw_connection 这个方式,发现不兼容 rails3 就放弃了

目前的解决办法,不是很漂亮,先图个能干活吧

s="insert into `history_products`(#{attrs}) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
whole_sql = ActiveRecord::Base.send(:replace_bind_variables, s, dd.attributes.values)
ActiveRecord::Base.connection.execute whole_sql

我印象中有个克隆表的,你可以先新建一个历史表,嗯,让历史表带上日期。

数据表克隆到历史表。 删除数据表某个 id 以下的数据。

大致思路你可以尝试下,以前这套实现是在 sqlserver 用存储过程做的。

You need to Sign in before reply, if you don't have an account, please Sign up first.