簡體   English   中英

如何在Rails中存儲計算值

[英]How Do I Store A Calculated Value In 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

我需要知道每當添加新注釋時如何調用此方法,並且還需要能夠按某種時間表進行計算。 我的目標是顯示首次訪問時參與度最低的用戶,並進行分頁,以顯示第2位到參與度最低的用戶,第3位,等等。

我的另一個問題是,即使使用def self.feedback_score_calc ,我也無法通過控制台運行此方法,也沒有方法錯誤。

對於您提供的代碼,它是Post上的實例方法。 你應該能夠做類似的事情

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

將其創建為具有def self.feedback_score_calc定義的方法不是您想要執行的操作,因為您要在Post的特定實例及其關系上進行計算。

正如@Kien Thanh在評論中提到的那樣,如果要查看列值反映在數據庫中,則需要在設置列值后調用Post實例上的save

@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

還值得一提的是,您可以像這樣調用write_attribute來直接寫一個列(繞過ActiveRecord設置的feedback_score=方法)

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! 當您嘗試從控制台內部對模型進行更改時,請從控制台內部進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM