2

Case1 : 関連付けられたオブジェクト (Status.id ではなく Status オブジェクト) を割り当てて、モデルの新しいレコードを作成する

    visit = Visit.create(:date => Date.today, :status => Status.first)
    visit.status_id #=> 1

レコードを作成した後

属性 'status_id' (Status オブジェクトではなく Status.id) を更新しようとしていますが、オブジェクトを保存した後に reload を呼び出しても古い値が返されます。例:

    visit.status_id = Status.last.id
    visit.save
    visit.reload
    visit.status_id #=> 1

作成後に reload メソッドを呼び出すと、期待どおりに動作しています

    visit = Visit.create(:date => Date.today, :status => Status.first)
    visit.status_id #=> 1
    visit.reload
    visit.status_id = 2
    visit.save
    visit.status_id #=> 2

ケース 2: Status オブジェクトの代わりに「status_id」値を割り当てた場合、オブジェクトをリロードする必要はなく、正常に動作します。

    visit = Visit.create(:date => Date.today, :status_id => Status.first.id)
    visit.status_id #=> 1
    visit.status_id = 2
    visit.save
    visit.status_id #=> 2

上記の 2 つのケースを使用すると、いつreloadメソッドを使用する必要がありますか? 前か後saveか?

4

1 に答える 1

5

saveやり方やreload仕事に対するあなたの理解は基本的に正しいと思います。あなたの結果は確かに矛盾しているようです。あなたの結果に基づいて、私はあなたsaveが失敗していると感じています。

saveローカル バージョンをデータベースに保存しようとします。ロード後にモデルが変更された場合、データベースの値は更新されません。失敗した場合save、ローカル値は設定した値のままですが、データベースには古い値が含まれます。

reloadローカルで行った変更を上書きし、データベースの値に設定します。

関心のあるモデルのデータベースに競合がないと仮定して、例を見ていきましょう。

例 1saveが機能する 場合、reloadは何もせず、 の値はvisit.status_idになりますStatus.last.id。ただし、 がsave失敗した場合、 の値はvisit.status_id元のデータベースにあったものになります。

例 2createが機能しない 場合、永続化されていないものを使用できないためreload、エラーが発生します。その後、を 2 に設定してから を呼び出します。が成功しても失敗しても、 のローカル値は2 のままです。ただし、データベースの値は、成功したか失敗したかによって異なります。RecordNotFoundreloadstatus_idsavesavestatus_id

例 3 おい!これは、リロード以外は例 2 と同じです。

ここにいくつかのドキュメントがありますが、それがどれほど役立つかはわかりません: http://apidock.com/rails/ActiveRecord/Persistence/save

http://apidock.com/rails/ActiveRecord/Persistence/reload

が実際に機能していることを確認するために、save成功を確認するか呼び出しsave!を行うことができます。save

それが役立つことを願っています。

于 2012-12-14T20:54:44.203 に答える