保存せずにActiveRecordモデルに値を大量に割り当てるには、assign_attributes
またはattributes=
メソッドを使用します。これらのメソッドはRails 3以降で使用できます。ただし、小さな違いと、バージョンに関連する注意すべき点があります。
どちらの方法もこの使用法に従います。
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
どちらのメソッドも検証を実行したり、コールバックを実行したりしないことに注意してください。コールバックと検証は、save
が呼び出されるれます。
Rails 3
attributes=
assign_attributes
Rails 3 attributes=
とは少し異なります。渡された引数がハッシュであることを確認し、ハッシュでない場合はすぐに戻ります。assign_attributes
そのようなハッシュチェックはありません。のActiveRecord属性割り当てAPIドキュメントをattributes=
参照してください。
次の無効なコードは、属性を設定せずに単に戻るだけで、静かに失敗します。
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
割り当ては正常に行われたかのように静かに動作しますが、実際にはそうではありませんでした。
この無効なコードはassign_attributes
、囲んでいる配列のハッシュキーを文字列化しようとすると、例外を発生させます。
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
のNoMethodError
例外が発生しstringify_keys
、最初の引数がハッシュではないことを示します。例外自体は実際の原因についてあまり情報を提供しませんが、例外が発生するという事実は非常に重要です。
これらのケースの唯一の違いは、一括割り当てに使用される方法です。attributes=
暗黙的に成功し、assign_attributes
例外が発生してエラーが発生したことを通知します。
これらの例は不自然に思えるかもしれませんが、ある程度ではありますが、このタイプのエラーは、APIからデータを変換するとき、または単に一連のデータ変換を使用しHash[]
て最終のの結果を忘れたときにも簡単に発生します.map
。50行以上のコードをいくつか維持し、属性割り当てから3つの関数を削除すると、失敗のレシピが得られます。
Rails 3のレッスンはこれです:の代わりに常に使用してください。assign_attributes
attributes=
Rails 4
Rails 4では、attributes=
は単にのエイリアスassign_attributes
です。のActiveRecord属性割り当てAPIドキュメントをattributes=
参照してください。
Rails 4では、どちらの方法も同じように使用できます。最初の引数としてハッシュを渡さないと、非常に役立つ例外が発生します。ArgumentError: When assigning attributes, you must pass a hash as an argument.
検証
の準備として割り当ての事前飛行を行っている場合はsave
、保存前の検証にも関心があるかもしれません。これにはvalid?
およびinvalid?
メソッドを使用できます。どちらもブール値を返します。 valid?
保存されていないモデルがすべての検証に合格した場合はtrueを、そうでない場合はfalseを返します。 invalid?
単にの逆ですvalid?
valid?
このように使用できます:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
これにより、を呼び出す前に、検証の問題を処理できますsave
。