【问题标题】:Correct way to update a record while calling an instance method.调用实例方法时更新记录的正确方法。
【发布时间】:2015-11-01 17:19:20
【问题描述】:

当我调用更新时,我不想只是像我想要的那样更新记录:

  1. 调用模型函数来更新模型的属性。
  2. 更新模型。

--

def update
    @simulation = Simulation.find(params[:id])
    @simulation.next # This is a function that has some logic to changes a property of the simulation record
    @simulation.update(simulation_params) 
end

这是解决此问题的正确方法,还是我应该使用单独的控制器功能或其他路线?

【问题讨论】:

  • Was.MMMMMMMMMMDelicious 采取了吗?
  • 不,我只是有一个有趣的口音。
  • 您的下一个方法是否只是向@simulation 添加一些属性,以便您的更新方法可以将它们与您的参数一起保存?
  • 它正在更改模型上现有的列变量,然后我想保存它。参数永远不会更改,只会更改下一个更改的另一个值。那么我应该下一个/更新还是应该有一个单独的方法来执行下一个/保存。
  • 为什么不只是一个名为 next! 的方法来完成所有操作(包括保存)。

标签: ruby-on-rails ruby model controller put


【解决方案1】:

为了清楚起见,我个人会在Simulation 中创建一个实例方法,高级代码应该类似于..

#Simulation model
class Simulation 

  ....

  def next_and_update(attrs)
    next
    update(attrs)
  end

end

#controller
def update
  @simulation = Simulation.find(params[:id])
  @simulation.next_and_update(simulation_params)
end

想法是,如果您可以阅读代码并了解发生了什么,可以多写 1-2 行。

【讨论】:

  • 我要走这条路,我喜欢将尽可能多的逻辑保留在控制器之外,并使它们更具可读性。
  • @NNNNNNNNNNDelicious,很高兴为您提供帮助,如果您想更花哨,请查看 rails service objects blog.engineyard.com/2014/…
【解决方案2】:

听起来“下一步”是一种在更新(或保存)之前处理一些幕后细节的方法。既然如此,你的所作所为是合情合理的。不需要其他控制器方法或路线。如果你想坚持“更新”,你可以。

在这种情况下,无论您完成更新还是保存都不会有所不同。更新和保存都更新数据库中的记录。

这有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多