2010-10-09 49 views
9

比方说,我们有一个模型中的方法是模型方法本身应该调用“保存”吗?

  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 

或者应该外部观察者(th e控制器)负责根据需要调用保存?

+0

以某种方式相关的问题:http://stackoverflow.com/questions/3125198/should-a-modifying-class-method-save-itself-or-be-explicity-called-after-the-meth – 2010-10-09 16:36:52

+0

此演示文稿测试可能能够帮助您找出该模型上的界面变得奇怪的地方。 https://github.com/jimweirich/presentation_testing_why_dont_we_do_it_like_this/raw/master/pdf/testing.key.pdf如果您觉得在测试应用程序时必须打到分贝,那么可能有一些功能可以考虑到这将使架构更易于使用。从第pg开始。 69. – 2011-02-07 21:15:21

+0

不知道它是如何与问题实际相关的,但是出色的表现 - 感谢分享! – 2011-02-09 06:08:18

回答

4

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

不过,我会让它从寻找你为什么这样做(的意见可能是很好的在这里)的方法清晰,并会肯定使这个bang_method!,使其清楚谁调用它,这方法很容易与对象混淆在一起。

此外,方法名称result(我知道,这可能不是您真正的方法名称)有点意味着您只是提取数据,并且稍微多一点。也许load_result!在这里更合适,为了让它更清楚你不仅仅访问一个属性,而且实际上是在执行繁重的操作来获取它。

2

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

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

b)只有当程序达到其正确性和数据完整性的一部分时? - 这是模型案例

c)两者。

我会为(c)投票。我希望这种歧视能让事情变得有点直接。另外,从面向对象设计的角度来看,save()方法属于它的类的公共契约;它可以被任何人调用。鉴于此,一个类负责其公共契约,并且如果需要,对象可以随意调用它自己的方法。

4

当然,有必要让模型坚持下去。但值得考虑的是保存是否是您的应用程序的最佳方法。

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

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

  1. 我们不想要或需要的AR回调的开销,我们特别想跳过验证,以确保发生更新当然,马上。
  2. 我们只需要更新一个属性。使用update_column避免了需要确定任何其他属性是否需要被保存(或不保存。)

模型内部,类似的方法

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

等,通常可能坚持比一个普通节省的变化的更合适的方式。

相关问题