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

fsword · 2013年05月30日 · 最后由 badboy 回复于 2013年05月31日 · 2587 次阅读

批量将数据转移到历史表,需要用 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 用存储过程做的。

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