如何在不担心主键的情况下更新记录

rai*_*new 13 activerecord ruby-on-rails

在ActiveRecord中,我们如何在不担心/知道主键的情况下更新记录.

如果我做

Address.update(15, :user_name => 'Samuel')
Run Code Online (Sandbox Code Playgroud)

它对应于

UPDATE addresses set user_name = 'Samuel' where id = 15
Run Code Online (Sandbox Code Playgroud)

但是,如果我想做什么:

UPDATE addresses set user_name = 'Samuel' where cid = 15
Run Code Online (Sandbox Code Playgroud)

什么是ActiveRecord相当于那?

我试过了:

Address.update({:cid => 15}, :user_name => 'Samuel')
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

typ*_*ror 43

使用update_all类方法:

Address.where(:cid => 15).update_all(user_name : 'Samuel')
Run Code Online (Sandbox Code Playgroud)

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

  • 重要说明:"它没有实例化所涉及的模型,也没有触发Active Record回调或验证.传递给`update_all`的值不会通过ActiveRecord的类型转换行为.它应该只接收可以按原样传递的值到SQL数据库." (3认同)
  • 这应该是答案.一击到数据库,几乎为零网络流量.尼斯. (2认同)

Fra*_*oto 16

a = Address.find_by_cid(15)
a.user_name = 'Samuel'
a.save
Run Code Online (Sandbox Code Playgroud)

  • 同意..必须有一个更好的答案. (2认同)

bou*_*uby 9

为了澄清@typeoneerror的答案,只需使用update_allActiveRecord :: Relation对象而不是记录对象:

ModelName.where(:unique_id => x).update_all(:name => "x")
Run Code Online (Sandbox Code Playgroud)

  • 你应该改进他的答案,而不是创造一个新的 (4认同)