2011-11-11 39 views
7

我想在“rails方式”中构建一个应用程序,所以这次不是回溯性地处理数据库中的记录,而是尝试使用before_save方法执行这些操作,即这一个:发送参数到before_save

def make_percentage_from(score) 
    percent = (score.fdiv(20) * 100) 
    return percent 
end 

每个进入数据库的项目在得分保存到数据库之前都有20分的分数我想以百分比的形式存储它,但是我遇到的问题是我无法发送任何通过before_save属性数据。

理想我不得不

before_save:make_percentage_from(比分将要计算)

我怎样才能做到这一点?谷歌不是为我打开了这么多,我坚决不具有处理这些数据一旦其存储(提供当然有另一种方式!)

感谢和问候

杰夫

Widget

回答

9

如果scorepercentage是属性:

class Widget < ActiveRecord::Base 
    before_validates :calculate_score_percentage 
    validates :percentage, :presence => true 
private 
    def calculate_score_percentage 
    self.percentage = score.fdiv(20) * 100 
    end 
end 

这工作,因为所有的属性/列有getter和塞特r方法由ActiveRecord自动定义。在calculate_score_percentage方法中对score的引用实际上是调用self.score方法,该方法将返回score对象/值。我们必须明确地使用self.percentage,因为单独使用percent会不明确 - 它可能是定义本地percentage变量,或者调用self.percentage=。默认值是前者,这不是我们想要的。

我使用before_validates来表明您可以在此处使用验证,这对于某些理智检查很有帮助。如果您不想进行任何验证,则可以在没有任何代码更改的情况下将其替换为before_save

+0

优秀,彻底的回应。 –

8

简短回答:回调从来没有参数。假定回调对对象执行操作或记录自身。因此,您需要将任何需要作为参数存储的参数存储为属性(存储到数据库)或实例变量。