Ruby:获取当前方法中先前方法的结果

时间:2018-01-24 19:19:58

标签: ruby-on-rails ruby methods

以下说明了我的问题:

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' }

作品。

3 个答案:

答案 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