如何在Rails中存储计算值

时间:2013-08-10 18:01:02

标签: ruby-on-rails

我正在开展一个项目,我希望始终显示反馈最少的帖子(目标是鼓励对正在进行的工作的反馈)。我已经计算出这个计算 - 虽然反馈是受欢迎的 - 但是,我在将此值分配给Post模型上的列(:feedback_score)时遇到了问题。我需要帮助。

post.rb:

class Post < ActiveRecord::Base
    def feedback_score_calc
        time_passed = ((Time.now - self.created_at)/1.hour).round(3)
        feedback = self.comments.count
        self.feedback_score = time_passed / feedback
    end
end

我需要知道每当添加新评论时如何调用此方法,我还需要能够在某种形式的计划中计算它。我的目标是显示最少参与第一次访问的分页,以进入第二次到最少参与,第三次等...

我的另一个问题是我甚至无法通过控制台运行此方法,即使使用def self.feedback_score_calc,也会出现无方法错误。

1 个答案:

答案 0 :(得分:1)

使用您提供的代码,它是Post上的实例方法。你应该可以做类似

的事情
@post = Post.find(some_id_here)
@post.feedback_score_calc

使用定义def self.feedback_score_calc将其创建为方法不是您想要做的,因为您正在对特定的实例进行计算Post和它的关系。

正如@Kien Thanh在评论中提到的那样,如果要在数据库中反映出来,则需要在设置列值后在save实例上调用Post

@post = Post.find(some_id_here)
@post.feedback_score_calc
@post.save

或方法本身

def feedback_score_calc
    time_passed = ((Time.now - self.created_at)/1.hour).round(3)
    feedback = self.comments.count
    self.feedback_score = time_passed / feedback
    save
end

另外值得一提的是,您可以通过调用feedback_score=这样直接写入(绕过write_attribute方法ActiveRecord设置)

def feedback_score_calc
    time_passed = ((Time.now - self.created_at)/1.hour).round(3)
    feedback = self.comments.count

    write_attribute(:feedback_score, time_passed / feedback)
    save
end

最后,您需要杀死并重新启动控制台,或者在对您尝试在控制台中验证的模型进行更改时,从控制台中运行reload!