【问题标题】:Ruby: Get result of previous method in current methodRuby:在当前方法中获取先前方法的结果
【发布时间】:2018-01-24 19:19:57
【问题描述】:

以下说明了我的问题:

User.all.testing

def self.testing
    v = self
    v.group_by { |user| user.username = 'username' }
end

导致:

类:0x8ca0558 的未定义方法 `group_by'

但是:

User.all.group_by { |user| user.username = 'username' }

有效。

【问题讨论】:

  • 我认为User.all.group_by(username: 'username') 不起作用? group_by 是来自 Enumerable 的方法,但它不带任何参数,但可以使用块调用,例如User.all.group_by { |u| u.username }。它可以称为User.all.group_by { ...,因为all返回的关系被隐式转换为数组。
  • @mikej 它确实有效。我怎样才能从testing 方法中调用它?
  • 听起来你可能有一些 gem 可以在你的项目中添加额外的功能?
  • @mikej 对不起,我在 StackOverflow 上复制该方法时出错了。显然必须是group_by { |user| user.username = 'username' }
  • 太酷了!谜团解开了:D

标签: ruby-on-rails ruby methods


【解决方案1】:

正如 cmets 中提到的,我无法解释这个接受参数的 group_by 方法来自哪里,但是为了让您的 testing 方法与 User.all.group_by(username: 'username') 一样工作,请将其写为

def self.testing
  all.group_by(username: 'username')
end

all 的使用将为您创建一个 ActiveRecord 关系。请注意,即使它说“全部”,如果您确实有任何其他有效范围,这些will be carried across。例如对于User.where(some: value).testing,它将正确运行。如果您直接调用testing 而不建立任何其他范围,即User.testing,则将使用默认范围。

【讨论】:

  • 啊.. 不知道all 跨越范围!
  • @jonhue 我刚刚更新了答案,其中包含指向 Rails 源代码相关位的链接。看看 - 它非常有趣且合乎逻辑。
  • 感谢参考!有道理。
【解决方案2】:

self 是一种ActiveRecord::Base 对象,因此没有group_by 方法。 group_by 是一个可枚举的方法。也许你的意思是group,在ActiveRecord::QueryMethods中实现?

【讨论】:

  • 不,我的意思是group_by。我想做与User.all.group_by(username: 'username') 相同的操作,但使用testing 方法。如果self 不可行,那是什么?
  • self.all.group_by 假设 self.classUser
【解决方案3】:

self.testing 表示这是一个类方法,可以像User.testing NOT User.all.testing 一样使用,因为User.all 返回活动记录关系。

解决方案:在模型中创建范围

class User < ApplicationRecord
  scope :testing, -> (username) { group_by(username: username) }
end

现在你可以使用User.all.testing

【讨论】:

  • 为什么要投反对票?这个答案是有道理的。
  • 类方法可以用于作用域,所以User.all.testing是有效的:blog.plataformatec.com.br/2013/02/…
  • scope 只是用一些额外的东西构建类方法的一种奇特方式,并且 [“使用类方法是接受范围参数的首选方式。”(guides.rubyonrails.org/…)。
  • 非常简洁明了的解释方式 - 谢谢@muistooshort
猜你喜欢
  • 1970-01-01
  • 2013-10-20
  • 2016-03-13
  • 2011-01-04
  • 2011-01-09
  • 2019-09-12
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多