如何在对模型执行操作之前对相关模型执行复杂的验证检查?

时间:2012-10-23 04:40:25

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

我正在构建一个简单的Ruby on Rails应用程序来进行问题管理。我有一个问题模型如下:

class Problem < ActiveRecord::Base
  attr_accessible :active, :impact, :incident_number, :issue_description, :root_cause, :user_id, :problem_summary, :incident_priority, :timeline_enabled
  attr_accessor :enable_timeline

  validates :problem_summary, :length => { :in => 10..100 }

  belongs_to :user
  has_one :timeline
  has_many :actionitems

end

与actionitems的模型有一个has_many belongs_to关联:

class Actionitem < ActiveRecord::Base
  attr_accessible :completion_date, :description, :initial_due_date, :notes, :problem_id, :revised_due_date, :status, :user_id

  belongs_to :problem
end

我希望能够更新问题记录并使用一些有限的验证保存它(我仍然需要添加它们)。但是,我想有一个“完整问题调查”按钮,它会触发问题控制器上的方法,将问题记录中的:active属性设置为false。我希望能够在执行此操作之前在问题记录上运行不同的,更完整的验证集,并且还要验证与此问题记录关联的所有操作项(如果有)都在:status“completed” 。

我有两个问题:

  1. 如何仅对给定的操作执行一组特定的验证?
  2. 如何在对问题执行操作之前验证Actionitem的相关实例是否处于“完成”状态?
  3. 这项任务对我来说似乎非常复杂。如果你能指出我需要利用的东西,以便能够实现这一点,将不胜感激! (我读过验证:on =&gt;:save etc和accepts_nested_attributes_for但我不知道如何将所有这些放在一起以实现我想要的行为。)

    非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

你需要在验证上应用检查条件,比如

validate :xyz , length => {:in => 1..12}, :if => , :if => lambda {self.active == true }

此验证仅在aCTIVE为TRUE时运行。同样,您可以通过检查添加更多验证

答案 1 :(得分:0)

试试这个

validates_length_of :problem_summary, :in => 10..100, :if => :status_active?

def status_active?
  self.active == true  
end

详细了解 - validations&amp; validates_length_of