我有一个2级嵌套表单(很像this),包含以下类。我遇到的问题是,当我不添加任何间隔(最深的嵌入文档)时,我不希望第二个最深的文档也被保留。在所有者中,我添加了拒绝声明,以检查是否有任何间隔传递,这是有效的。
但是,当时间表最初有间隔但是它们在表单中被销毁时(通过传递_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标记计划。但理想情况下,解决方案将是客户端无关的。
答案 0 :(得分:2)
如何将此添加到Owner类:
before_update do
schedules.each |schedule|
schedule.destroy if schedule.intervals.empty?
end
end