0

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

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而不是collect时,我收到了这个错误:

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

我怎样才能让它工作?

感谢您的时间和智慧!!

4

2 回答 2

3

我不知道您要实现什么,但是当您首先调用 scoped 时应该能够使用它

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

没有scoped,你试图调用self.collectwhich 不是ActiveRecord模型的方法。在scoped那里意味着你想申请collect当前链。

于 2013-03-04T11:28:57.807 回答
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

唯一的另一种方法是动态附加一个方法到集合中,但这会非常难看。

于 2013-03-04T11:28:16.613 回答