我的模型有两个属性:A ast
- 属性(jsonb
),其中包含复杂的数据结构和compiled
- 属性(string
)可以随时从ast
- 属性重新创建。
由于编译过程可能很长,我想在compiled
- 属性发生更改时更新ast
属性。对于这种缓存行为,我会使用before_save
回调,只检查ast
是否已更改,然后可能启动编译过程。
由于compiled
- 属性严格依赖于ast
- 属性,因此没有理由直接设置它。我想通过明确覆盖compiled=
来做到这一点,但也许有更优雅的方法来做到这一点?在这种情况下,如何从回调中自己设置属性?
对我而言,这感觉就像我错过了Rails已经实现的一些功能。所以我没有像上面所描述的那样重新发明轮子,而是倾向于采用" Rails方式"。
答案 0 :(得分:1)
我会远离回调并做类似的事情:
def ast=(value)
super(value)
self.send(:compiled=, from_ast(ast), force: true) # from_ast is meant to transform the data the way you need
end
def compiled=(value, force: false)
super(value) if force
# maybe raise if force is false?
end