2014-12-02 44 views
1

我在這個模型中的範圍有問題,我在如何最好地解決它的輸了。我想從範圍內調用distinct_mechanics_sql以保持事物更清潔,但是當我運行這個時,我得到一個「未定義的局部變量或方法」錯誤。這裏是模型:從Active Record範圍內訪問類方法?

class Mechanics < ActiveRecord::Base 
    scope :with_moz, -> { joins("JOIN (#{distinct_mechanics_sql}) mh ON mh.mechanic_id = mechanics.id") } 

    def distinct_mechanics_sql 
    """ 
    SELECT DISTINCT ON (mechanic_id) * 
    FROM checkups 
    ORDER BY mechanic_id, updated_at DESC 
    """ 
    end 

end 

任何幫助將不勝感激!

回答

2

作用域與類方法相同,因此在該作用域內隱式調用另一個類方法。而你distinct_mechanics_sql是一個實例方法,使用它的作用域裏面聲明爲:是偉大的工作

def self.distinct_mechanics_sql 

def Mechanics.distinct_mechanics_sql 

class << self 
    def distinct_mechanics_sql 
    ... 
    end 
end 
+0

謝謝!既然它只是一個我插入到範圍調用中的字符串,有沒有更好的方法來做到這一點?將它作爲一個類常量存儲?你會推薦什麼類似的東西? – newUserNameHere 2014-12-02 21:32:36

+0

我不建議你使用範圍,以及純SQL。你應該儘量使用ORM。現在,我建議您將所有這些東西都移到一個類的方法中。然後,如果您無法將代碼從純SQL更改爲AR調用,則可以將關係和工作類方法顯示給社區([codereview](http://codereview.stackexchange.com/))以進行改進。 – 2014-12-02 21:40:44

+0

謝謝。我不知道codereview,我會用它。 – newUserNameHere 2014-12-02 21:44:11