在Rails中,将find与:select一起使用后,我的对象不保存

时间:2020-03-05 18:59:52  来源:igfitidea点击:

运行类似:

@users = User.find(:first,:select =>"姓名,姓氏,薪水")
为@users中的@user做
@ user.salary = 100000
@ user.save
结尾

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

解决方案

回答

为了保存数据,ActiveRecord不知道对象的ID。
因此,请在:select中包含id字段,如下例所示:

@users = User.find(:first,:select =>" id,名称,姓氏,薪水")

回答

尝试改用.update或者.update_attributes:它们是为编辑而设计的(与.save相反,后者用于创建新行)

回答

使用.save!如果保存失败,也会抛出错误。

回答

John Ruby是正确的,我们需要在选择中包括对象的ID。
另外,我们几乎不需要使用:select选项。我们可以使用联接,或者在选择整行时是否存在真正的性能问题,但这并没有太多。
而且,我们实际上不需要将所有这些变量都设置为实例变量(@)。循环中的@user可以是本地var。如果确实需要所有用户作为@users,则可以执行以下操作:

@users = User.find(:all, :select => "id, name, lastname, salary")
@users.each do |user|
  user.salary = 10000
  user.save
end

我们可能还希望查看ActiveRecord的update_all以进行简单更改。但是请注意,这不会调用任何保存回调。

回答

我意识到这是一个很老的问题,但是正确的答案是::select返回的任何对象都是只读的。

请参阅正式的Rails Active Record查询指南,第3.2节:
http://guides.rubyonrails.org/active_record_querying.html

奇怪的是,我没有在API中看到此内容。