1. ホーム
  2. ruby-on-rails

[解決済み】Rails: #update_attributeと#update_attributesの比較

2022-04-03 05:01:59

質問

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

これらは両方とも、ActiveRecordに明示的に更新を指示しなくても、オブジェクトを更新することができます。

Rails APIによると。

属性更新

単一の属性を更新し、通常の検証手順を経ずにレコードを保存します。これは、特に既存のレコードのブール値フラグに対して有効です。バリデーションモジュールがデフォルトで組み込まれている場合、Base の通常の update_attribute メソッドはこのメソッドに置き換わります。

<ブロッククオート

更新された属性

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

つまり、オブジェクトを検証させたくない場合は、以下のようにします。 #update_attribute . もし、この更新を #before_save スタックオーバーフローしますか?

私の質問は #update_attribute は保存前もバイパスするのか、それとも検証だけなのか。

また、ハッシュを #update_attributes ... 一番上にある私の例を見てください。

解決方法は?

をご参照ください。 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) もし perform_validation が false の場合、すべての バリデーション に関連する 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])