2013-02-14 2 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のフィールドを変更せずにレコードを更新する場合、これは動作しません。それ以外の場合、それは行く方法です。 –

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

+0

これは 'update_all'とは違って一つのレコードしか更新しませんが、' updated_at'とコールバックの更新はスキップします。 – carbonr

関連する問題