我正在开展一个项目,我希望始终显示反馈最少的帖子(目标是鼓励对正在进行的工作的反馈)。我已经计算出这个计算 - 虽然反馈是受欢迎的 - 但是,我在将此值分配给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
,也会出现无方法错误。
答案 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!
。