【发布时间】:2010-06-30 17:56:38
【问题描述】:
如何使用嵌套属性验证模型是否具有至少一个关联模型?这一直让我发疯,因为我确信我错过了一些简单的东西。例如,我想要求 List 始终至少有一个 Task。
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,但这样它就不会删除任何任务
【问题讨论】:
标签: ruby-on-rails validation activerecord