Rails 4如何在实例方法中访问模型属性

时间:2014-08-19 21:16:19

标签: ruby-on-rails

我遇到了一个看似简单的问题,但我无法弄清问题是什么。我正在使用Rails 4构建API。

我有一个名为Constant

的模型
class Constant < ActiveRecord::Base

  def self.calcuate_something(a, b, c, d, e)
    self.number_one + self.number_two + (self.number_three*a) + (self.number_four*b) + (self.number_five*c) + (self.number_six*d) + (self.number_seven*e)
  end

end

此模型包含number_onenumber_twonumber_threenumber_fournumber_fivenumber_sixnumber_seven属性。

在我的控制器中,我这样做:

@constant = Constant.find_by_id(params[:id])
number = @constant.calculate_something(1, 2, 3, 4, 5)

然后我收到一条错误NoMethodError (undefined method 'number_one' for #<Class:0x007fd3d4466068>):。我没有尝试访问名为number_one的方法,我试图在模型中找到该字段。

我已经验证了所有条目都有一个名为number_one的列,并且每个条目都有一个值。我的语法或设置有问题吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

问题在于您对self.calculate_something(a, b, c, d, e)的定义。使用关键字self实际上是创建一个类方法而不是实例方法,因此无法访问这些属性。

尝试将其重构为def calculate_something(a, b, c, d, e)

评论更新:

第二个问题是@constant被分配给由Constant.find_by_id(params[:id])而不是记录实例生成的ActiveRecord_Relation,因为rails在必要时不会自动评估查询。可以通过将find_by_id更改为find来解决此问题,或者强制查询按Constant.find_by_id(params[:id]).first执行。就个人而言,我喜欢更改为find,因为您知道您想要的特定记录。

答案 1 :(得分:1)

阅读Class and Instance Methods in Ruby,您想要将对象的方法定义为不带self.的实例方法:

def calculate_something(a, b, c, d, e)

但是,如果要定义类方法,则需要使用self

请勿使用find_by_id,您需要使用find,如下所示:

@constant = Constant.find(params[:id])