2

Railsコンソールを使用してモデルレコードを作成し、新しい変数を使用して取得し、いくつかのフィールドを更新します。

var = MyModel.new
var.name = "my name"
var.save

var2 = MyModel.last
var2.name = "your name"
var2.save

これで、古い変数に戻ると、フィールドがその値に上書きされることはなく、var.save単に戻ります。truename"my name"

なんで?

4

1 に答える 1

3

Railsモデルはデフォルトで「ダーティ」です。つまり、属性設定関数はattribute=()、属性を変更済みとしてマークし、次回の保存時にこの属性を更新するようにRailsに指示します。この情報は、データベースではなくモデルに保存されます。で、 Railsvar.saveは変更されたことがわかっている属性のみを更新します。Railsは、何も変更されていないと判断した場合、データベースの不一致をチェックしません(これは、実稼働環境では非常に遅くなります)。

var.reloadデータベースから対応するオブジェクトに属性を再ロードするために使用できます。

編集:上記のコメントを明確にするために、テストコードでは使用しMyModel.lastないでください。MyModel.firstデータベースに複数の行がある場合、MyModel.firstは最後に保存されたオブジェクトを参照しないためvar2var完全に異なるオブジェクトを参照します。

于 2012-05-24T03:00:27.717 に答える