假设我们在模型中有一个方法
- 需要仅在保存的记录上调用
- 可能会更新模型本身,因此需要在文字之后再次保存模型
应该在方法本身内发生“保存”调用,如下面的代码
def result
save! if new_record?
# do some funky stuff here that may also change the model state
# ...
# And calculate the return value
search_result = "foo" # Let's say "foo" is the value we calculated
save! if changed?
search_result # return
end
或者外部观察员(控制器)是否应负责根据需要进行保存?
如果你的方法真的,真的需要做所有这些,那就这样吧。
但是,我会通过查看你为什么这样做的方法来说清楚(评论可能在这里很好),并且会 无疑 做这个 bang_method!
所以无论谁调用它都很清楚,这种方法很容易弄乱对象。
另外,方法名称 result
(我知道,这可能不是你真正的方法名称)有些暗示你只是获取数据,而不是更多。也许 load_result!
在这里更合适,更清楚的是你不仅仅是访问一个属性,而且实际上是在执行繁重的操作来获取它。
绝对有时候模型必须坚持自己。但是值得考虑是否 保存 是您的应用程序的最佳方法。
在当前示例中,我们有一个模型,它在长时间运行的方法中异步处理文件(我们正在使用sidekiq关闭进程。)在方法内部,持久属性会定期更新,因此状态信息可用于其他请求。
我们正在使用 update_column 而不是 保存因为
- 我们不希望或不需要AR回调的开销,我们特别希望跳过验证以确保更新确实立即发生。
- 我们只需要更新一个属性。运用 update_column 避免需要确定是否需要保存(或不保存)任何其他属性。
在模型内部,方法如
- update_column
- save(:validate => false) (授予,相同的方法,但不同的选项)
- 触摸
等等,通常可能是比普通更持久的变更方式 保存。
程序何时在文件上保存数据?
a)仅在用户需要时(直接或间接)? - 这是控制器案例
b)只有当程序实现部分正确性和数据完整性时? - 这是典型案例
c)两者。
我会投票给(c)。我希望这种歧视会使事情变得更加紧张。
另外,从面向对象的设计角度来看,方法save()属于其类的公共契约;它可以被任何人调用。鉴于此,一个类负责其公共合同,如果需要,一个对象可以随意调用自己的方法。