2014-12-02 21 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