我有一个模型可以从特定城市获取所有游戏。当我获得这些游戏时,我想过滤它们并且我想使用 reject 方法,但是我遇到了一个我试图理解的错误。

# STEP 1 - Model
class Matches < ActiveRecord::Base
  def self.total_losses(cities)
    reject{ |a| cities.include?(a.winner) }.count
  end
end

# STEP 2 - Controller
@games = Matches.find_matches_by("Toronto")
# GOOD! - Returns ActiveRecord::Relation

# STEP 3 - View
cities = ["Toronto", "NYC"]
@games.total_losses(cities)
# FAIL - undefined method reject for #<Class:0x00000101ee6360>

# STEP 3 - View
cities = ["Toronto", "NYC"]
@games.reject{ |a| cities.include?(a.winner) }.count
# PASSES - it returns a number.

为什么 reject 在我的模型中失败,但在我看来没有?

最佳答案

不同之处在于您正在调用 reject 的对象。在 View 中,@games 是一个 Active Record 对象数组,所以调用 @games.reject 使用的是 Array#reject 。在您的模型中,您在类方法中对 reject 调用 self ,这意味着它正在尝试调用不存在的 Matches.reject 。您需要先获取记录,如下所示:

def self.total_losses(cities)
  all.reject { |a| cities.include(a.winner) }.count
end

关于ruby - ActiveRecord 和使用拒绝方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5207424/

10-13 04:46