在Rails中,使用find with:select后,我的对象不保存

时间:2008-09-17 20:09:11

标签: ruby-on-rails ruby activerecord

运行类似:

@users = User.find(:first,:select =>“name,lastname,salary”) for @user in @users do   @ user.salary = 100000   @ user.save 端

在查找Mysql表后,用户不会更新。

5 个答案:

答案 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中看到这一点。