【问题标题】:ActiveRecord, can I validates a has_and_belongs_to association?ActiveRecord,我可以验证 has_and_belongs_to 关联吗?
【发布时间】:2014-11-07 11:11:31
【问题描述】:

昨天,我疯了,因为我无法在模型中进行验证,在 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

【问题讨论】:

    标签: ruby-on-rails ruby validation activerecord


    【解决方案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】:

      我想你错过了Active Record Validations guide 中的validates_associated 方法。

      这是一个例子:

      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
      

      【讨论】:

      • 我没找到! :/。你用过一次吗?一些不同的方法来创建自己的验证?
      • 对不起,我没有得到你。你用过一次吗?:是的,它有效。一些不同的方法来创建你自己的验证?:不,这正是我在示例中提到的方式。
      • 因为我想验证(使用你的例子)例如。 : 只允许在关系表books_authors 中的寄存器为 3 或更少的情况下添加新作者。
      • 这对我不起作用:/我更新了我的问题,我试过了:D
      • @BrunoCasali :查看更新后的答案。您应该提到验证您可以拥有的最大关联数,而不是验证关联本身。两者都是不同的东西。
      【解决方案3】:

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

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

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

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

      谢谢!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多