在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中看到此内容。