2010-04-26 62 views
10

在ActiveRecord中,我们如何更新记录而不必担心/知道主键。如何更新记录而不用担心主键

如果我做

Address.update(15, :user_name => 'Samuel') 

它对应于

UPDATE addresses set user_name = 'Samuel' where id = 15 

,但如果我想要做什么:ActiveRecord的相当于是

UPDATE addresses set user_name = 'Samuel' where cid = 15 

将是什么?

我想:

Address.update({:cid => 15}, :user_name => 'Samuel') 

,但不起作用。

回答

14
a = Address.find_by_cid(15) 
a.user_name = 'Samuel' 
a.save 
+9

你正在发射两个查询...坏的方式.. – 2011-08-09 10:26:53

+2

同意..必须有更好的答案。 – baash05 2012-04-18 02:49:41

41

使用update_all类方法:

Address.where(:cid => 15).update_all(user_name : 'Samuel') 

http://apidock.com/rails/ActiveRecord/Relation/update_all

+2

这应该是答案。一击到数据库,几乎为零的网络流量。尼斯。 – baash05 2012-04-26 02:33:43

+3

重要注意事项:“它没有实例化所涉及的模型,也没有触发Active Record回调或验证,传递给'update_all'的值不会经历ActiveRecord的类型转换行为,它应该只接收可以as-是到SQL数据库的。“ – ehannes 2016-05-23 09:02:02

7

要澄清@ typeoneerror的回答,只是用update_all一个ActiveRecord :: Relation对象上,而不是记录对象:

ModelName.where(:unique_id => x).update_all(:name => "x") 
+0

不需要是唯一的身份证号码。 – laffuste 2014-06-06 02:33:09

+4

你应该改进他的答案而不是创建一个新的 – 2015-06-01 17:48:40

+0

这个答案是在其他答案没有例子的时候写的,只有这个方法的链接。 – 2016-04-22 03:20:34

相关问题