Rails模型中的集合方法获取错误NoMethodError:未定义的方法`collect'

时间:2013-03-04 11:21:22

标签: ruby-on-rails ruby

我无法将方法应用于模型中的集合。这是我的模型的样子:

class MyModel < ActiveRecord::Base
  def self.range(min, max)
    where(id: min..max)
  end

  def self.my_collection_method
    collect{|x| x.id}
  end
end

这有效:

MyModel.range(53, 55)
# [#<MyModel id: 53>, #<MyModel id: 54>]

这有效:

MyModel.range(53, 55).collect{|x| x.id}
# [53, 54]

但是当我试图想要使用 my_collection_method 而不是收集时,我收到此错误:

MyModel.range(53, 55).my_collection_method
# NoMethodError: undefined method `collect' for #<Class:0x007fcbad3efc30>

我怎样才能让它发挥作用?

感谢您的时间和智慧!

2 个答案:

答案 0 :(得分:3)

我不知道你想要实现的目标,但是当你第一次调用范围时你应该可以使用它

def self.my_collection_method
  scoped.collect {|x| x.id}
end

没有scoped,您试图调用self.collect,这不是ActiveRecord模型的方法。拥有scoped表示您希望将collect应用于当前链。

答案 1 :(得分:2)

您已在模型上定义my_collection_method,而不是在集合上定义 - 它们是单独的类。您通常可以在模型方法中实现您想要做的事情:

class MyModel < ActiveRecord::Base
  def self.range(min, max)
    where(id: min..max)
  end

  def self.my_collection_method(min, max)
    range(min, max).collect{|x| x.id}
  end
end

唯一的另一种方法是将一个方法即时附加到集合中,但这将非常难看。