如何在rails控制台中使用新创建的方法

时间:2011-12-04 23:28:42

标签: ruby-on-rails ruby-on-rails-3

我在我的一个模型中创建了一个相当简单的新方法。但是,当我进入rails控制台进行测试时,我收到以下错误:

NoMethodError: undefined method 'get' for #<Class:0x3a5032fc>

我保存了代码,关闭了rails控制台然后重新启动,但我仍然得到了NoMethod

class Race <ActiveRecord::Base
  def get(race_date,track_name,race_number)
    Race.where(:date =>race_date, :race_nbr => race_number, :track_id => (Track.where(:track_code => track_name)))
  end
end

在控制台中,我输入以下内容:

Race.get("2011-12-04", "BEL", 1)

产生NoMethodError:undefined method 'get'

任何想法都会受到赞赏。

3 个答案:

答案 0 :(得分:7)

您定义了Race类的实例方法。也许你会定义一个类方法,如:

def self.get(race_date, track_name, race_number)
    track = Track.where(:track_code => track_name)
    Race.where(:date => race_date, :race_nbr => race_number, :track_id => track)
end

然后您可以使用Race.get

答案 1 :(得分:4)

@luttette做对了;你需要创建一个类方法。下面是另一种可以定义类方法的方法。在您定义大量类方法的大型项目中,它可以是一种更简洁的组织代码方式,但这种观点纯粹是主观的。

class << self
  def get(race_date,track_name,race_number)
    Race.where(:date => race_date, 
               :race_nbr => race_number, 
               :track_id => (Track.where(:track_code => track_name)))
  end
end

class << self中定义的所有内容都成为一种类方法。

另一个选择是使用范围。

scope :get, 
      lambda { |race_date, track_name, race_number| 
               Race.where(:date => race_date, 
                          :race_nbr => race_number, 
                          :track_id => (Track.where(:track_code => track_name))) }

这个最后的解决方案作为范围看起来有点笨拙,所以在这种情况下最好使用类方法而不是范围。此外,我更喜欢具有描述性名称的范围,但我想这也适用于方法名称。

答案 2 :(得分:4)

在得到两个很好的答案之后,我觉得应该说出其他的东西:

如果您的控制台已经启动,则不会猜测您已添加了一些代码,因此您必须重新加载。

哟这样做,只需输入:

reload!
控制台中的

(=不需要CTRL-C)。