2

すべてのインスタンスで他のインスタンスの同じ属性に依存する属性を持つモデルがあるとします。これの最も良い例は、リスト内の項目の順序属性です。

アイテムの古い値と新しい値の両方がある場合、残りのアイテムの注文属性を更新するのに最適な場所は before_update コールバック メソッドになります。

しかし、リスト内の他のアイテムを更新するたびに、コールバックが何度も何度も呼び出されます...

これを解決するエレガントな方法を探しています。

:update_without_callbacks メソッドについて聞いたことがありますが、プライベート メソッドを使用したくありません。また、余分な属性を追加する必要がないように感じます。

何か良いアイデアはありますか?前もって感謝します!

4

2 に答える 2

1

エントリ全体でこの種の更新を行わなければならないという事実は、問題を適切に概念化していないことを示唆していると思います。order 属性を持つ List モデルを作成し、List モデルと Item モデルの間に 1 対多の関係を作成します。このように、注文情報を更新する場所は 1 か所だけであり、複雑で脆弱なコールバックは必要ありません。

于 2012-04-04T18:53:48.560 に答える
1

1 つの方法はupdate_all、他のすべての項目の順序をまとめて設定するために使用することです。

そうすれば、クエリの数を効率的に 1 つに制限し、コールバックがトリガーされないようにすることができます。

https://github.com/rails/rails/blob/83e42d52e37a33682fcac856330fd5d06e5a529c/activerecord/lib/active_record/relation.rb#L274

于 2012-04-04T18:26:05.493 に答える