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

3
什么时候在Rails中保存模型?谁负责调用保存,是模型本身还是调用者?
假设我有一个用户模型,其中包含像udpate_pointsupdate_level等(公共)方法。有两个选择:
  1. 模型/方法负责调用保存。所以每个方法只需调用self.save
  2. 调用者负责调用保存。所以每个方法只更新属性,但当使用者完成对用户的操作时,调用者调用user.save
权衡比较明显: 在选项#1中,确保模型保存,但我们在每个事务中多次调用保存。 在选项#2中,我们每个事务只调用一次保存,但调用者必须确保调用保存。例如:team.leader.update_points需要我调用team.leader.save,这有点不直观。如果我有多个方法处理同一模型对象,则情况可能会更加复杂。
根据请求添加更多具体信息: update_level检查用户拥有的积分数量并更新用户的级别。该函数还调用Facebook API来通知其用户已经达到新的级别,因此我可能将其作为后台作业执行。

最佳实现完全取决于方法“update_points”和“update_level”的作用。它们传递了哪些参数,以及这些参数的作用是什么? - weexpectedTHIS
1个回答

1

我最喜欢实现这种东西的方式是使用attr_accessors和model hooks。以下是一个例子:

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... 另外,当一个字段被更新时(不仅仅是points),adjust_points将被调用,所以我不确定为什么要使用它。 - EugeneMi
嗯,是的,adjust_points 每次都会被调用,但你可以看到有一个条件语句,如果 attr_accessor 没有设置,就会停止执行。 - weexpectedTHIS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接