问题 模型方法本身应该调用“保存”吗?


假设我们在模型中有一个方法

  1. 需要仅在保存的记录上调用
  2. 可能会更新模型本身,因此需要在文字之后再次保存模型

应该在方法本身内发生“保存”调用,如下面的代码

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

或者外部观察员(控制器)是否应负责根据需要进行保存?


9710
2017-10-09 16:34


起源

不知怎的相关问题: stackoverflow.com/questions/3125198/... - Nikos D
这个关于测试的演示文稿可能会帮助您找出此模型上的界面变得奇怪的地方。 github.com/jimweirich/... 如果您在测试应用程序时感觉必须使用db,那么可能会考虑一些可以使架构更易于使用的功能。从pg开始。 69。 - Tim Snowhite
不知道它究竟与这个问题有什么关系,但不论是出色的演示 - 感谢分享! - Nikos D


答案:


如果你的方法真的,真的需要做所有这些,那就这样吧。

但是,我会通过查看你为什么这样做的方法来说清楚(评论可能在这里很好),并且会 无疑 做这个 bang_method! 所以无论谁调用它都很清楚,这种方法很容易弄乱对象。

另外,方法名称 result (我知道,这可能不是你真正的方法名称)有些暗示你只是获取数据,而不是更多。也许 load_result! 在这里更合适,更清楚的是你不仅仅是访问一个属性,而且实际上是在执行繁重的操作来获取它。


4
2017-10-09 16:48





绝对有时候模型必须坚持自己。但是值得考虑是否 保存 是您的应用程序的最佳方法。

在当前示例中,我们有一个模型,它在长时间运行的方法中异步处理文件(我们正在使用sidekiq关闭进程。)在方法内部,持久属性会定期更新,因此状态信息可用于其他请求。

我们正在使用 update_column 而不是 保存因为

  1. 我们不希望或不需要AR回调的开销,我们特别希望跳过验证以确保更新确实立即发生。
  2. 我们只需要更新一个属性。运用 update_column 避免需要确定是否需要保存(或不保存)任何其他属性。

在模型内部,方法如

  • update_column
  • save(:validate => false)  (授予,相同的方法,但不同的选项) 
  • 触摸

等等,通常可能是比普通更持久的变更方式 保存


4
2018-02-19 16:20





程序何时在文件上保存数据?

a)仅在用户需要时(直接或间接)? - 这是控制器案例

b)只有当程序实现部分正确性和数据完整性时? - 这是典型案例

c)两者。

我会投票给(c)。我希望这种歧视会使事情变得更加紧张。

另外,从面向对象的设计角度来看,方法save()属于其类的公共契约;它可以被任何人调用。鉴于此,一个类负责其公共合同,如果需要,一个对象可以随意调用自己的方法。


2
2017-10-09 16:58