对象更新的复杂验证?

时间:2015-12-31 07:02:49

标签: ruby activerecord ruby-on-rails-4.1 mysql2

我有一个模型“WorkDetail”和与问题相关的db-attrs是'name','status'和'approved_status',数据类型为all integer,模型类定义如下: -

class WorkDetail < ActiveRecord::Base
  enum name: [:smartcheck, :install, :verify]
  enum status: [:pending, :inprogress, :complete]

  belongs_to :work_order
  has_many :cabinets

  after_save :work_order_status_update

  private

  def work_order_status_update
    work_detail_count = self.work_order.work_details.count
    status_array = self.work_order.work_details.where(status: 2).count
    if status_array == work_detail_count
      if work_detail_count == 0
        self.work_order.update({status: "pending"})
      else
        self.work_order.update({status: "complete"})
      end
    else
      self.work_order.update({status: "inprogress"})
    end
  end
end  

现在,我想添加自定义验证以应用于以下问题: -

  1. 验证应仅适用于更新过程。

  2. 如果对象的name == "smartcheck"status == "complete"只有approved_status布尔属性应为updatedtrue( 迁移时默认值为false),否则应该给出错误 smartchecked,尝试更新时状态不完整 approved_status attr。

  3. 希望这个问题有道理,谢谢!事先人们,Happy Coding。

1 个答案:

答案 0 :(得分:0)

  

1)验证应仅适用于更新过程

 after_save :work_order_status_update,  :on => :update
  

2)如果对象的名称==“smartcheck”且状态==“完成”则仅   approved_status布尔属性应更新为true(   迁移时默认值为false),否则应该给出错误   smartchecked,尝试更新时状态不完整   approved_status attr。

def test_status_and_name
  if self.name == "smartcheck" and self.status == "complete"
    self.update_attributes(approved_status: true)
  else
    errors[:base] << "smartchecked and the status is not complete on trying to update approved_status attr."
  end
end