2

开始:这是我第一次尝试从模型/控制器空间中获取业务逻辑。这是我试图抽象的一些初始逻辑。路径是app/services/Date_calc.rb

class Date_calc
  require User
  require Report

  def months(range)
    User.first.reports.order("report_month desc").limit(range).pluck(:report_month)
  end
end

在我的应用程序中,我有两个模型,用户和报告。用户 has_many 报告。该reports表有一个名为 的字段report_month

Date_calc.months(6)在 Rails 控制台中调用返回: TypeError: no implicit conversion of Class into String.

我的预期响应是一系列日期,例如["01/01/2013", "01/02/2013", "01/03/2013", ... ].

我不确定我在这里做错了什么。

4

2 回答 2

3

问题是require需要一个字符串(例如require "path_to_module"),但你给它一个类:

require User
require Report

如果这是在 Rails 中运行的,那么 Rails 将自动加载这两个类。你根本不需要做require

编辑:在你删除这些行之后,Date_calc.months(6)仍然会给你一个 NoMethodError,因为months它是一个实例方法,但你试图调用它,就好像它是一个类方法一样。您需要在 Date_calc 类的实例上调用它,如下所示:

Date_calc.new.months(6)

或者,您可以将其定义为类方法,def self.months(range)而不是def months(range),这将允许您调用Date_calc.months(6). 但是您可能想考虑 Date_calc 是否实际上应该是一个类,或者它是否应该是一个模块。

如果你想拥有它的多个实例,它应该是一个类,就像你想要一个用户实例或报表实例一样。“用户”和“报告”都是名词,因为该类表示我们可能希望拥有多个的事物。“我想创建一个 Date_calc”这句话有意义吗?“我想创建两个 Date_calcs”这句话怎么样?如果你对两者都说是,那么上课就有意义了。

但是,如果您只是想要一些东西来放入一些相关的方法,但这并不代表 a thing,那么您可能想要使用模块来代替。例如,在 Rails 中,Rails对象不是一个类,它是一个模块。说“我想创建一个 Rails”是没有意义的,更不用说“我想创建两个 Rails”了。Rails 只是一个用于将相关方法组合在一起的模块。如果 Date_calc 符合该描述,那么它作为一个模块更有意义:

module Date_calc
  def self.months(range)
    # ...
  end
end

# and then...
Date_calc.months(6)

如您所见,我们使用def self.months而不是def months,因为我们希望能够调用模块本身的方法。

于 2014-12-09T19:58:19.473 回答
3

除了缺少引号的要求行之外,您正在调用类的实例方法。您要么需要像这样实例化 Date_calc

months = Date_calc.new.months(6)

或使其成为这样的类方法

def self.months(range)...
于 2014-12-09T20:00:32.373 回答