Rails 3:保存模型的最佳实践

时间:2012-09-09 02:53:30

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

我应该何时将模型保存在导轨中?谁应该负责调用save,模型本身或调用者?

假设我的用户模型中有udpate_pointsupdate_level等公共方法。有两个选项:

  1. 模型/方法负责调用save。因此,每种方法都只需调用self.save
  2. 来电者负责拨打保存。因此,每个方法只更新属性,但调用者在用户完成后调用user.save
  3. 权衡取舍相当明显: 在选项#1 中,模型可以保证保存,但我们会为每个事务调用save多次。 在选项#2 中,我们每个事务只调用一次保存,但调用者必须确保调用save。例如,team.leader.update_points会要求我调用team.leader.save,这有点不直观。如果我在同一模型对象上运行多个方法,这会变得更加复杂。

    根据请求添加更具体的信息: 更新级别查看用户拥有的点数并更新用户级别。该函数还调用facebook api通知它用户已达到新级别,因此我可能会有效地将其作为后台作业执行。

1 个答案:

答案 0 :(得分: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