限制belongs_to ActiveRecord中的兄弟姐妹数量?

时间:2013-03-20 12:13:13

标签: ruby-on-rails ruby-on-rails-3 validation activerecord belongs-to

您如何验证属于父对象的子项数?

例如,如果我有一个问题对象接受答案的嵌套属性:

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。

我做错了什么?是否有解决方法来执行此类验证?

感谢您的帮助

2 个答案:

答案 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,如果我已正确阅读您的问题,则应限制结果。