如何使用嵌套属性验证模型至少有一个关联模型?这让我很疯狂,因为我相信我可能漏掉了一些简单的东西。例如,我想要求列表始终至少具有一个任务。
我尝试了许多不同的选项。 1- 添加列表验证:
但是这仍然允许您删除一个已存在列表的所有任务,因为在删除任务时,列表的验证发生在任务被销毁之前。
2- 在before_save回调中检查是否有任何任务未标记为销毁。
由于某种原因,我无法通过对任务列表进行迭代的任何方式来删除任务。如果我在
3- 需要存在任务
class List < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
accepts_nested_attributes_for :tasks, :allow_destroy => true
end
class Task < ActiveRecord::Base
belongs_to :list
end
我尝试了许多不同的选项。 1- 添加列表验证:
def validate
if self.tasks.length < 1
self.errors[:base] << "A list must have at least one task."
end
end
但是这仍然允许您删除一个已存在列表的所有任务,因为在删除任务时,列表的验证发生在任务被销毁之前。
2- 在before_save回调中检查是否有任何任务未标记为销毁。
before_save :check_tasks
private
#look for any task which won't be deleted
def check_tasks
for t in self.tasks
return true if ! t.marked_for_destruction?
end
false
end
由于某种原因,我无法通过对任务列表进行迭代的任何方式来删除任务。如果我在
def validate
中执行此检查而不是回调,则结果相同。3- 需要存在任务
validates_presence_of :tasks
,但使用此选项将永远不会删除任何任务。
list.tasks.reload
。 - Tatjana N.