我无法将方法应用于模型中的集合。这是我的模型的样子:
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>
我怎样才能让它发挥作用?
感谢您的时间和智慧!
答案 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
唯一的另一种方法是将一个方法即时附加到集合中,但这将非常难看。