您如何验证属于父对象的子项数?
例如,如果我有一个问题对象接受答案的嵌套属性:
class Question < ActiveRecord::Base
has_many :answers
accepts_nested_attributes_for :answers, :allow_destroy => true
end
我想限制答案的数量,我可能会在答案对象中添加自定义验证,检查其父级并计算其他答案:
class Answer < ActiveRecord::Base
belongs_to :question
validate :check_max_answers
private
def check_max_answers
count = question.answers.select {|a| a != self}.count
if (count > 10)
errors.add(:answers, 'Too many answers!')
end
end
end
当check_max_answers运行时,它只计算已经保留的其他答案。
因为答案被保存为嵌套属性,所以验证都会传递初始保存,因为没有保存任何问题,然后它们都会被保存,从而变得无效!
同样,如果我将验证放在问题对象上,同样会出现同样的问题,因为在初始保存之前,answers.count始终为0。
我做错了什么?是否有解决方法来执行此类验证?
感谢您的帮助
答案 0 :(得分:1)
解决了这个问题。它只计算数据库中的答案的原因是我使用.count而不是.size。
在我的情况下,我还需要打折标记为销毁的答案。因此,问题的验证如下:
def check_answers
if answers.select{|a|not a._destroy}.size > 10
errors.add(:answers, 'Too many answers')
end
end
这可以按预期工作。
答案 1 :(得分:0)
has_many关联支持选项:limit,如果我已正确阅读您的问题,则应限制结果。