如何验证是否在Rails中实际更新了update_all

时间:2011-02-16 23:12:23

标签: ruby-on-rails ruby ruby-on-rails-3

鉴于此代码

def create
  @upgrades = User.update_all(["role = ?","upgraded"], :id => params[:upgrade])
  redirect_to admin_upgrades_path, :notice => "Successfully upgraded user."    
end

如果保存或不重定向到适当的页面和消息,我如何在该操作中进行实际验证?

1 个答案:

答案 0 :(得分:8)

在Rails3中,除了更新的记录数之外,update_all不会返回任何有意义的信息(这可能取决于您的DBMS是否返回该信息)。

http://ar.rubyonrails.org/classes/ActiveRecord/Base.html#M000343

它不会实例化任何对象,您可以通过查看日志来验证这一点。

如果我的数据库中有用户ID为4和5(没有其他人),这就是我得到的:

irb(main):007:0> u = User.update_all( "id = id", :id => 5 ) 
=> 1
irb(main):008:0> u = User.update_all( "id = id", :id => 55 )
=> 0
irb(main):009:0> u = User.update_all( "id = id", :id => [4,5] )
=> 2
irb(main):010:0> u = User.update_all( "id = id", :id => [4,53] )
=> 1
irb(main):011:0> u.class
=> Fixnum

如果要获取已修改的记录,则必须使用“更新”,传入ID值列表,然后您将收到实例化的对象。

请注意,如果您拥有大量ID,则可以通过实例化太多对象轻松压倒服务器的内存。

我能想到的另一种方法是首先查询将要升级的对象(使用对象分组,只选择需要显示的表中的属性,从而节省内存),生成你的报告,然后运行Update_All查询...