1

私は Rails 3.2 アプリケーションを構築していますが、関係を維持し、挿入と削除を処理するためだけに、Sidekiq ジョブを別のモデルにカプセル化する必要があります。

私は Mongoid をプライマリ ORM として使用していますが、不変のレコードを作成する方法を知りたいです。

これは、(初期化および) ジョブの作成後、変更は受け入れられず、レコードを削除することを意味します。

ありがとう!

4

2 に答える 2

2

Rails アプリが唯一の MongoDB クライアントであると仮定すると、モデル層で不変性ロジックを実装できます。

class Job
    include Mongoid::Document
    before_validation { false if changed? && persisted? }
end

saveまたはcreateを初めて呼び出すとJob、データは正常に保持されます。を呼び出すと、オブジェクトに対するそれ以上の変更はデータベースに書き込まれませんsave。の動作はdelete影響を受けません。

なぜこれが機能するのか

before_validationfalse が返された場合、永続性をキャンセルします。

before_validation コールバックの戻り値が false と評価される場合、プロセスは中止され、Base#save は false を返します。もし ActiveRecord::Validations#save! 呼び出されると、ActiveRecord::RecordInvalid 例外が発生します。エラー オブジェクトには何も追加されません。

メソッドリファレンス

  1. かわった?ダーティなフィールドがある場合は true を返します

  2. 持続?このオブジェクトのあるバージョンがデータベースに保存されている場合は true を返します

于 2013-01-16T08:42:35.837 に答える