2013-02-14 61 views

回答

39

您可以使用update_all如下:

User.where(:id => user.id).update_all({:field1 => true, :field2 => true}) 

這將生成以下更新語句(mysql):

UPDATE users SET field1 = 1, field2 = 1 WHERE users.id = <whatever> 

回調和驗證將不會運行。

+0

如果你的目標是不改變的updated_at字段更新記錄,這是不行的。否則,這是要走的路。 – 2016-06-07 16:33:22

1

什麼做這樣的:

user.attributes = attributes 
user.save(validate: false) 
0

如果您需要速度,您還可以直接在AR連接上調用執行。我用這樣的東西來導入大量的數據。

connection = ActiveRecord::Base.connection 
email = connection.quote(email) 
zip = connection.quote(zip) 
connection.execute(%{UPDATE "users" SET "email" = #{email}, "zip" = #{zip} WHERE "users"."id" = #{user.id}}) 

注意驗證和回調將不會運行。

https://stackoverflow.com/a/25171127/1520775

1

複製你可以這樣做:

update_columns(field1: value, filed2: value) 
+2

這只是ActiveRecord的V4.0.2提供更高: http://apidock.com/rails/ActiveRecord/Persistence/update_columns – ckbhodge 2016-11-08 18:31:48

+0

這隻更新不像'update_all'單記錄,但它跳過更新'updated_at'和回調 – carbonr 2017-07-26 22:36:48