2014-03-27 92 views
0

我在Ruby on Rails的新的,對下面的代碼有點混亂Rails和Ruby類,實例變量

module Comment 
    class CommentScore < ActiveRecord::Base 
    self.table_name = 'comment_scores' 

    # Associations 
    belongs_to :provider_account 

    # Scopes 
    scope :by_provider_account_id, lambda { |provider_account_id| where(provider_account_id: provider_account_id) } 

    # Instance methods 
    def set 
     return unless self.valid? 
     return if unsettable? 
     self.positive_count = provider_account.comment.total(:positive) 
     self.total   = provider_account.comment.total(:all) 
     self.score   = decimal 
     self.save! 
    end 

    def decimal 
     positive_count.to_d/total.to_d 
    end 
    end 
end 
從我的研究

,我知道,如果「自我」關鍵字內部使用一種方法,它只是實際調用的方法就像這個例子,self.positive_count,調用該方法「positive_count」這軌,意味着名爲「positive_count」表列。

所以我在'十進制'方法有點困惑,它只是使用'positive_count'沒有自我?這不是一個局部變量嗎?

回答

1

ActiveRecord將爲您的模型中的每個字段定義getter和setter,例如。在這種情況下,你會得到positive_countpositive_count=定義。

你可以很容易地調用getter,就像你用你的十進制方法做的那樣。然而,調用二傳手就像你在你的set方法,你需要使用self - 否則,你只會設置局部變量與值的方法,而不是調用的二傳手。

+0

簡潔明瞭。不知道activerecord會自動定義getter和setter。當我讀到這一切都有道理。謝謝。 – Finks

0

當存在如positive_count這樣的局部變量時,沒有周期和參數的形式positive_count將被解釋爲局部變量。如果不是,那麼它將被解釋爲一種方法。但是,形式爲foo=的方法必須是私有的。

0

基於上下文和已定義的方法,Ruby將嘗試確定是否正在進行方法調用或讀取或分配給變量。與其他必須預先定義局部變量的語言(int total)不同,或者使用不同語法($int)指定變量的語言不同,Ruby的語法更加清晰。這可能會導致一些含糊不清。

如果有一個方法用特定名稱定義,如decimal或者有一個方法可以接受值,例如total=,那麼將在引用這些方法時調用方法。否則,推測它們是變量。

使用self避免了歧義並強制進行方法調用。它通常用於確保沒有意外創建變量的風險。

考慮以下幾點:

def example 
    total = 50 
end 

total一個變量,或者是有一個叫total=方法可以用來代替?這個簡短的例子並不清楚。默認情況下,Ruby會將其視爲一個變量。

現在,如果你有叫total數據庫列,這是發現後的原始模型的代碼已被加載。那時沒有叫做total=的方法。該方法在該模型的第一個實例被實例化後動態創建。這是你展示了self -dot符號:

def example 
    self.total = 50 
end 

這可以確保你分配給屬性,而不是創建錯誤的局部變量。