【问题标题】:Rails - Validate Presence Of Association?Rails - 验证关联的存在?
【发布时间】:2011-08-07 02:07:17
【问题描述】:

我有一个模型 A,它与另一个模型 B 有“has_many”关联。我有一个业务需求,即插入 A 需要至少 1 条关联记录到 B。有没有我可以调用的方法来确保这一点是真的,还是我需要编写自定义验证?

【问题讨论】:

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


    【解决方案1】:

    你可以使用validates_presence_ofhttp://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates_presence_of

    class A < ActiveRecord::Base
      has_many :bs
      validates_presence_of :bs
    end
    

    或者只是validates http://apidock.com/rails/ActiveModel/Validations/ClassMethods/validates

    class A < ActiveRecord::Base
      has_many :bs
      validates :bs, :presence => true
    end
    

    但是如果您将accepts_nested_attributes_for:allow_destroy =&gt; true 一起使用,则会出现错误:Nested models and parent validation。在本主题中,您可以找到解决方案。

    【讨论】:

      【解决方案2】:

      -------- Rails 4 ------------

      简单的validatespresence为我工作

      class Profile < ActiveRecord::Base
        belongs_to :user
      
        validates :user, presence: true
      end
      
      class User < ActiveRecord::Base
        has_one :profile
      end
      

      这样,Profile.create 现在将失败。在保存profile 之前,我必须使用user.create_profile 或关联用户。

      【讨论】:

        【解决方案3】:

        您可以验证与validates_existence_of(这是一个插件)的关联:

        来自this blog entry 的示例 sn-p:

        class Tagging < ActiveRecord::Base
          belongs_to :tag
          belongs_to :taggable, :polymorphic => true
          validates_existence_of :tag, :taggable
        
          belongs_to :user
          validates_existence_of :user, :allow_nil => true
        end
        

        或者,您可以使用validates_associated。正如答案下方的Faisal notes in the commentsvalidates_associated 通过运行关联的类验证来检查关联的对象是否有效。它检查是否存在。同样重要的是要注意 nil 关联被认为是有效的。

        【讨论】:

          【解决方案4】:

          如果要确保关联既存在又保证有效,还需要使用

          class Transaction < ActiveRecord::Base
            belongs_to :bank
          
            validates_associated :bank
            validates :bank, presence: true
          end
          

          【讨论】:

          • 如果您可以向validates 传递一个额外的选项,比如valid: true 而不必单独调用validates_associated,那不是很好。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          • 1970-01-01
          相关资源
          最近更新 更多