运行类似:
@users = User.find(:first,:select =>“name,lastname,salary”) for @user in @users do @ user.salary = 100000 @ user.save 端
在查找Mysql表后,用户不会更新。
答案 0 :(得分:18)
ActiveRecord不知道对象的id,以便保存数据。 因此,将id字段包含在:select中,如下例所示:
@users = User.find(:first,:select =>“id,name,lastname,salary”)
答案 1 :(得分:2)
John Ruby是正确的,你需要在select中包含对象的id 此外,您很少需要使用:select选项。您可以使用连接,或者如果选择整行时存在真正的性能问题,但这并不会太多 而且你真的不需要将所有这些变量设置为实例变量(@)。循环中的@user可以是局部变量。如果您确实需要所有用户作为@users,您可以这样做:
@users = User.find(:all, :select => "id, name, lastname, salary") @users.each do |user| user.salary = 10000 user.save end
您可能还想查看ActiveRecord的update_all以进行简单的更改。但请注意,这不会调用任何保存回调。
答案 2 :(得分:0)
尝试使用.update或.update_attributes:这些是为编辑而设计的(与.save相反,用于创建新行)
答案 3 :(得分:0)
使用.save!如果无法保存,也会抛出错误。
答案 4 :(得分:0)
我意识到这是一个非常古老的问题,但是正确的答案,我相信任何返回的对象:select都是只读的。
参见官方Rails Active Record查询指南,第3.2节:
http://guides.rubyonrails.org/active_record_querying.html
奇怪的是,我没有在API中看到这一点。