【问题标题】:Rails 3: Best practices for saving modelsRails 3:保存模型的最佳实践
【发布时间】:2012-09-09 02:53:29
【问题描述】:

我应该什么时候将我的模型保存在 Rails 中?谁应该负责调用 save、模型本身或调用者?

假设我的用户模型中有udpate_pointsupdate_level 等(公共)方法。有两种选择:

  1. 模型/方法负责调用 save 。所以每个方法都会调用self.save
  2. 调用者负责调用save。所以每个方法只更新属性,但调用者在用户完成后调用user.save

权衡是相当明显的: 在选项 #1 中,模型保证会保存,但我们在每个事务中调用 save 多次。 在选项 #2 中,我们每个事务只调用一次 save,但调用者必须确保调用 save。例如team.leader.update_points 需要我打电话给team.leader.save,这有点不直观。如果我有多个方法在同一个模型对象上运行,这可能会变得更加复杂。

根据要求添加更具体的信息: 更新级别查看用户有多少积分并更新用户的级别。该函数还调用 facebook api 来通知它用户已经达到了一个新的水平,所以我可能会有效地将它作为后台作业执行。

【问题讨论】:

  • 最佳实现完全取决于“update_points”和“update_level”方法的作用。它们传递了哪些参数以及它们如何处理这些参数?

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord


【解决方案1】:

我最喜欢的实现这种东西的方法是使用 attr_accessors 和模型挂钩。这是一个例子:

class User < ActiveRecord::Base
  attr_accessor :pts

  after_validation :adjust_points, :on => :update

  def adjust_points
    if self.pts
      self.points = self.pts / 3 #Put whatever code here that needs to be executed
    end
  end
end

然后在您的控制器中执行以下操作:

def update
  User.find(params[:id]).update_attributes!(:pts => params[:points])
end

【讨论】:

  • 有趣的方法,但我不确定它是否能解决我的问题......你基本上只是在每次更新类时调用该方法,但你仍然必须调用 update.我的问题是你什么时候必须调用 save/update.... 在不同的注释上,每次更新字段(不仅仅是点)时都会调用 adjust_points,所以我不确定你为什么要使用它。
  • 嗯,是的,adjust_points 每次都会被调用,但是您可以看到如果 attr_accessor 未设置,则有一个条件会停止执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多