代码之家  ›  专栏  ›  技术社区  ›  Nikos D

模型方法是否应该调用“save”本身?

  •  11
  • Nikos D  · 技术社区  · 14 年前

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

    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
    

    或者外部观察者(控制器)是否应该负责根据需要调用save?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Matchu    14 年前

    但是,我可以通过查看方法来明确您为什么要这样做(这里的注释可能很好),并且 一定地 bang_method! 因此,无论是谁调用它,都可以清楚地看到,这个方法可能会随意处理对象。

    另外,方法名 result (我知道,这可能不是你真正的方法名)多少意味着你只是在获取数据,还有更多。也许 吧 load_result!

        2
  •  4
  •   Tom Wilson    12 年前

    在某些情况下,模型必须保持其自身。但值得考虑的是 是应用程序的最佳方法。

    在当前的示例中,我们有一个模型,它在一个长时间运行的方法中异步处理一个文件(我们使用sidekiq将该进程分离)。在该方法中,一个持久性属性会定期更新,以便其他请求可以使用状态信息。

    我们正在使用 ,因为

    1. 我们不希望或不需要AR回调的开销,而且我们特别希望跳过验证,以确保更新确实且立即发生。
    2. 更新\u列

    • 保存(:validate=>false) (授予,方法相同,但选项不同)

    等等,通常可能是一种比简单的方法更合适的方法来保持变化 节约 .

        3
  •  2
  •   Ioannis    14 年前

    程序什么时候把数据保存在文件上?

    c) 两者都有。

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