当继承定义Trailblazer操作时,它会继承其超类的合同:
class Create < Trailblazer::Operation
contract do
...
end
...
end
class Update < Create
...
end
继承的Trailblazer操作合同是否可以改变其超类定义的验证?
出现这个问题是因为创建操作的合同定义了一个强制属性,在更新操作中需要是可选的:
validates :foo, presence: true
最初的想法是以某种方式在继承的类中反转这个定义,但似乎没有办法做到这一点(有可能忽略子类中的属性(writeable:false
- book p61)但似乎无法更改其有效性标准。)
答案 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使用模式。)