以下说明了我的问题:
User.all.testing
def self.testing
v = self
v.group_by { |user| user.username = 'username' }
end
导致:
未定义方法`group_by'用于类:0x8ca0558
然而:
User.all.group_by { |user| user.username = 'username' }
作品。
答案 0 :(得分:2)
正如评论中所述,我无法解释接受参数的group_by
方法来自哪里,但要使testing
方法的工作方式与{{1}相同把它写成
User.all.group_by(username: 'username')
使用def self.testing
all.group_by(username: 'username')
end
将为您创建ActiveRecord关系。请注意,即使它表示" all",如果您确实有其他作用域will be carried across。例如它会对all
行为正确。如果您直接致电User.where(some: value).testing
而没有建立任何其他范围,即testing
,那么将使用默认范围。
答案 1 :(得分:0)
self
是一种ActiveRecord::Base
对象,因此没有group_by
方法。 group_by
是一个Enumerable方法。也许您的意思是group
,它是在ActiveRecord::QueryMethods
?
答案 2 :(得分:0)
self.testing
表示这是一个类方法,可以像User.testing
NOT User.all.testing
一样使用,因为User.all
会返回活动记录关系。
解决方案:在模型中创建范围
class User < ApplicationRecord
scope :testing, -> (username) { group_by(username: username) }
end
现在您可以使用User.all.testing