1

次のクラスを持つ 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 でマークします。しかし、理想的には、解決策はクライアントに依存しません。

4

1 に答える 1

2

これを Owner クラスに追加するのはどうですか:

before_update do 
  schedules.each |schedule|
    schedule.destroy if schedule.intervals.empty?
  end
end
于 2013-02-05T16:18:05.217 に答える