代码之家  ›  专栏  ›  技术社区  ›  Ryan Horrisberger

验证是否存在嵌套属性

  •  4
  • Ryan Horrisberger  · 技术社区  · 16 年前

    如何使用嵌套属性验证模型是否至少有一个关联模型?这让我抓狂,因为我确信我错过了一些简单的东西。例如,我想要求一个列表总是至少有一个任务。

    class List < ActiveRecord::Base
      has_many :tasks, :dependent => :destroy
      accepts_nested_attributes_for :tasks, :allow_destroy => true
    end
    
    class Task < ActiveRecord::Base
      belongs_to :list
    end
    

    1-向列表添加验证:

    def validate
      if self.tasks.length < 1
        self.errors[:base] << "A list must have at least one task."
      end
    end
    

    现有的

    before_save :check_tasks
    
    private
    #look for any task which won't be deleted
    def check_tasks
      for t in self.tasks
        return true if ! t.marked_for_destruction?
      end
      false  
    end
    

    出于某种原因,我无法让它删除任何迭代列表任务的任务。如果我办理登机手续也是一样的 def validate

    3-要求有任务 validates_presence_of :tasks ,但它不会删除任何任务

    2 回复  |  直到 16 年前
        1
  •  8
  •   Tatjana N.    16 年前

    您可以在验证方法中同时检查这两个条件:

      validate :check_tasks
      def check_tasks
        if self.tasks.size < 1 || self.tasks.all?{|task| task.marked_for_destruction? }
          errors.add_to_base("A list must have at least one task.")
        end
      end
    
        2
  •  3
  •   Ryan Horrisberger    16 年前

    def save
      saved = false
      ActiveRecord::Base.transaction do
        saved = super
        if self.conditions.size < 1
          saved = false
          errors[:base] << "A rule must have at least one condition."
          raise ActiveRecord::Rollback
        end
      end
      saved
    end