昨天,我很疯狂,因为我无法在模型中进行验证,在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
答案 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
,因为它更简单易用!
谢谢!