次のクラスを持つ 2 レベルのネストされたフォーム (このように) があります。私が抱えている問題は、間隔 (最も深い埋め込みドキュメント) を追加しない場合、2 番目に深いドキュメントも保持したくないということです。所有者に、渡された間隔があるかどうかを確認する拒否ステートメントを追加しました。これは機能します。
ただし、スケジュールに元々間隔があったが、(_destroy: true を渡すことによって) フォームで破棄された場合、スケジュールも破棄する必要があります。これを行う最良の方法は何ですか?永続化された後にドキュメントを破棄するスケジュール上のコールバックを回避したいと思います。
class Owner
include Mongoid::Document
embeds_many :schedules
attr_accessible :schedules_attributes
accepts_nested_attributes_for :schedules, allow_destroy: true, reject_if: :no_intervals?
def no_intervals?(attributes)
attributes['intervals_attributes'].nil?
end
end
class Schedule
include Mongoid::Document
embeds_many :intervals
embedded_in :owner
attr_accessible :days, :intervals_attributes
accepts_nested_attributes_for :intervals,
allow_destroy: true,
reject_if: :all_blank
end
class Interval
include Mongoid::Document
embedded_in :schedule
end
更新: おそらく、これはフォーム自体で行うのが最善でしょうか? すべての間隔が _destroy: true でマークされている場合は、スケジュールも _destroy: true でマークします。しかし、理想的には、解決策はクライアントに依存しません。