继承的Trailblazer操作合同是否可以改变其超类定义的验证?

时间:2016-02-26 10:00:40

标签: trailblazer

当继承定义Trailblazer操作时,它会继承其超类的合同:

class Create < Trailblazer::Operation
  contract do 
    ... 
  end
  ...
end

class Update < Create
  ...
end

继承的Trailblazer操作合同是否可以改变其超类定义的验证?

出现这个问题是因为创建操作的合同定义了一个强制属性,在更新操作中需要是可选的:

validates :foo, presence: true

最初的想法是以某种方式在继承的类中反转这个定义,但似乎没有办法做到这一点(有可能忽略子类中的属性(writeable:false - book p61)但似乎无法更改其有效性标准。)

2 个答案:

答案 0 :(得分:1)

一种解决方案是在每个操作合同中使用外部表单。通过将表单提取到外部类,create操作将包括和扩充它,如下所示:

contract Form do
  validates :upload, presence: true
end 

并且更新操作将简单地包括在内:

contract Form

现在Create中添加的验证不适用于Update

答案 1 :(得分:0)

您可以通过向验证程序添加delete pc.* from parent_child as pc left join child as c on pc.id_child=c.id where c.id = 1; delete from child where child.id = 1; 语句来实现所需的结果:

if

仅当记录尚未保存到数据库时才会运行验证,因此在更新操作期间将跳过该记录。 (这假设您正在使用ActiveModel并遵循正常的CRUD使用模式。)