266
obj.update_attribute(:only_one_field, 'Some Value')
obj.update_attributes(field1: 'value', field2: 'value2', field3: 'value3')

これらはどちらも、ActiveRecord に更新を明示的に指示しなくても、オブジェクトを更新します。

Rails API は次のように述べています。

update_attribute

単一の属性を更新し、通常の検証手順を経ずにレコードを保存します。これは、既存のレコードのブール フラグに特に役立ちます。Base の通常の update_attribute メソッドは、検証モジュールが混在している場合にこれに置き換えられます。これはデフォルトです。

update_attributes

渡されたハッシュからすべての属性を更新し、レコードを保存します。オブジェクトが無効な場合、保存は失敗し、false が返されます。

したがって、オブジェクトを検証したくない場合は、 を使用する必要があります#update_attribute。でこの更新を行った場合#before_save、stackoverflow になりますか?

私の質問は#update_attribute、保存前または検証だけをバイパスすることです。

また、ハッシュを渡す正しい構文は何#update_attributesですか...上部の私の例を確認してください。

4

11 に答える 11

345

を参照してくださいupdate_attribute。ソースを表示をクリックすると、次のコードが表示されます

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2614
2614:       def update_attribute(name, value)
2615:         send(name.to_s + '=', value)
2616:         save(false)
2617:       end

そして今update_attributes、あなたが得るそのコードを参照して見てください

      # File vendor/rails/activerecord/lib/active_record/base.rb, line 2621
2621:       def update_attributes(attributes)
2622:         self.attributes = attributes
2623:         save
2624:       end

2つの違いは、update_attribute使用するのsave(false)に対し、update_attributes使用するsaveか、または言うことができますsave(true)

説明が長くて申し訳ありませんが、言いたいことは重要です。save(perform_validation = true)が falseの場合、に関連付けられているすべての検証perform_validationをバイパスします (適切な言葉はスキップします) 。save

2番目の質問について

また、ハッシュを update_attributes に渡す正しい構文は何ですか...上部の私の例を確認してください。

あなたの例は正しいです。

Object.update_attributes(:field1 => "value", :field2 => "value2", :field3 => "value3")

また

Object.update_attributes :field1 => "value", :field2 => "value2", :field3 => "value3"

または、すべてのフィールドのデータと名前をハッシュで取得する場合は、params[:user]ここで言うだけを使用します

Object.update_attributes(params[:user])
于 2010-05-06T05:32:09.140 に答える
74

ヒント: コミットa7f4b0a1update_attributeを介してRails4で非推奨になりました。を優先して削除します。update_attributeupdate_column

于 2012-06-27T13:11:14.973 に答える
17

update_attribute

このメソッドは、モデル ベースの検証を呼び出すことなく、オブジェクトの単一の属性を更新します。

obj = Model.find_by_id(params[:id])
obj.update_attribute :language, “java”

update_attributes

このメソッドは、単一オブジェクトの複数の属性を更新し、モデル ベースの検証にも合格します。

attributes = {:name => “BalaChandar”, :age => 23}
obj = Model.find_by_id(params[:id])
obj.update_attributes(attributes)

この回答が、アクティブレコードのどの方法をいつ使用するかを明確にすることを願っています。

于 2013-01-21T10:42:46.110 に答える
13

また、指定された属性のみを更新する一括割り当て方法とは対照的に、更新update_attributeする目的の属性を更新するために でホワイト リストに登録する必要がないことも注目に値します。attr_accessibleupdate_attributesattr_accessible

于 2012-08-09T07:32:17.940 に答える
8

update_attributeモデルの 1 つの属性のみを更新するだけですが、update_attributesメソッドで複数の属性を渡すことができます。

例:

user = User.last

#update_attribute
user.update_attribute(:status, "active")

検証に合格します

#update_attributes
user.update_attributes(first_name: 'update name', status: "active")

検証が失敗した場合は更新されません。

于 2015-04-20T12:26:58.897 に答える
7

属性の割り当てまたはレコードの更新 (Rails 4 に更新) update_attribute, update, update_column, update_columns etc. http://www.davidverhasselt.com/set-attributes-in-activerecord/のすべての可能な方法に関するこのブログ投稿にアクセスすることに興味があるかもしれません。たとえば、検証の実行、オブジェクトの updated_at へのタッチ、コールバックのトリガーなどの側面が異なります。

OPの質問への回答として、update_attributeコールバックをバイパスしません。

于 2015-07-14T07:21:56.700 に答える
5

update_attributeupdate_attributesは似ていますが、大きな違いが 1 つあります。それは、検証を実行update_attribute しないことです。

また:

  • update_attribute単一の属性でレコードを更新するために使用されます。

    Model.update_attribute(:column_name, column_value1)
    
  • update_attributes複数の属性を持つレコードを更新するために使用されます。

    Model.update_attributes(:column_name1 => column_value1, :column_name2 => column_value2, ...)
    

これらの 2 つの方法は、名前と機能が似ているため、非常に混同しやすいです。したがって、update_attributeを優先して削除されupdate_columnます。

さて、Rails4ではModel.update_column(:column_name, column_value)次の場所で使用できますModel.update_attribute(:column_name, column_value)

の詳細については、ここをクリックしてupdate_columnください。

于 2014-03-20T08:46:56.237 に答える
4

あなたの質問に答えるために、update_attribute保存前の「検証」をスキップしますが、その他のコールバックなどは引き続き実行after_saveします。したがって、「列を更新してARクラフトをスキップするだけ」が本当に必要な場合は、(明らかに)使用する必要があります

Model.update_all(...)https://stackoverflow.com/a/7243777/32453を参照してください

于 2014-05-21T18:38:21.387 に答える
3

update_attribute最近、 vs . と検証の問題に遭遇しましたupdate_attributes。名前が似ていて、動作が異なり、混乱しています。

ハッシュを渡してupdate_attribute検証をバイパスするには、次のようにします。

object = Object.new
object.attributes = {
  field1: 'value',
  field2: 'value2',
  field3: 'value3'
}
object.save!(validate: false)
于 2015-05-06T06:18:02.247 に答える
1

あなたの質問は、before_save に update_attribute があると無限ループにつながるかどうかだと思います (もともと update_attribute 呼び出しによってトリガーされた before_save コールバックの update_attribute 呼び出しの)

実際にはレコードを保存しないため、 before_save コールバックをバイパスしていると確信しています。を使用して、検証をトリガーせずにレコードを保存することもできます

Model.save false

于 2010-05-06T05:39:14.777 に答える