ActiveRecord,我可以验证has_and_belongs_to关联吗?

时间:2014-11-07 11:11:31

标签: ruby-on-rails ruby validation activerecord

昨天,我很疯狂,因为我无法在模型中进行验证,在Rails 4.1.6上的ActiveRecord上使用many-to-many关系。

我尝试使用此gem:gem 'deferred_associations'建议:this blog 但没有成功。

所以我杀了MVC的感觉......我在控制器中做了验证......:/ 但是现在我改变了我的应用程序的关系和业务逻辑。 但问题仍然存在。

有人可以向我解释一下has_and_belongs_to_many这种关系的可能性吗?

我的问候!

更新01 至@ User089247

     # My logic is simple: A question should has 3 or less answers.
     # A answer can be used in many questions.


     validates_associated :answers, if: :has_more_space?

      private
      def has_more_space?
        if answers.size > 3
          true
        else
          errors.add(:answers, "You can't do that!")
          false
        end
      end

3 个答案:

答案 0 :(得分:1)

我认为您错过了validates_associated中的Active Record Validations guide方法。

以下是一个例子:

class Book < ActiveRecord::Base
  has_and_belongs_to_many :authors

  validates_associated :authors
end

请确保你:

  

不要在关联的两端使用validates_associated。他们   会在一个无限循环中互相称呼。

因为,您正在寻找的并不完全验证关联的存在,validates_associated将不适用于您的情况。 validates_associated验证协会的存在。要验证模型可以拥有的关联数,您必须创建如下自定义验证:

validate :maximum_answers

private
def maximum_answers
  errors.add(:base, "You can't add more than 3 answers.") if self.reload.answers.count >= 3
end

答案 1 :(得分:1)

听起来你需要自定义验证

#in Author class

validate :must_have_3_books_or_less

def must_have_3_books_or_less
  if self.books_authors.size > 3
    self.errors.add_to_base("Author is required to have 3 books or less")
  end
end

答案 2 :(得分:0)

感谢所有试图帮助我的人,但是随着时间的推移,我已经阅读了documentation,我发现了这一部分:

  

你应该使用has_many:through如果你需要验证,回调,   或连接模型上的额外属性。

换句话说,我试图以错误的形式做事!

目前我知道,如果您不需要验证任何内容,请使用has_and_belong_to_many,因为它更简单易用!

谢谢!