ruby / rails 4:如何在模型中设置一个可用于多种方法的变量

时间:2014-02-06 20:16:56

标签: ruby-on-rails

我有一个Event模型。这是一个超级简单的模型,有两个before_save回调。

其中一个是:

def set_note
   if status == "ON"
     core = RubySpark::Tinker.new(ENV["COREID"])
     core.digital_write(0, "HIGH")
   elsif status == "OFF"
     core = RubySpark::Tinker.new(ENV["COREID"])
     core.digital_write(0, "LOW")
   end 
end 

我以前在方法之外有'core = RubySpark',但应用程序返回了一个错误,'core'是一个无效的局部变量。我可以将其设置为实例变量吗?可以在模型中设置实例变量吗?

3 个答案:

答案 0 :(得分:1)

我个人对此的偏好是将一些代码提取到另一种方法中。

这样的事情:

def set_note
  if status == "ON"
    core_digital(0, "HIGH")
  elsif status == "OFF"
    core_digital(0, "LOW")
  end 
end

def core_digital(num, val)
  core_method.digital_write(num, val)
end

def core_method
  RubySpark::Tinker.new(ENV["COREID"])
end

您可能希望将该方法命名为比我的示例更有意义的方法。

答案 1 :(得分:0)

这实际上取决于调用此方法的次数,或者实际上,调用RubySpark::Tinker.new(ENV["COREID"]的次数。如果只有一次,则不需要将其声明为实例变量。你可以这样做:

def set_note
   core = RubySpark::Tinker.new(ENV["COREID"])
   if status == "ON"
     core.digital_write(0, "HIGH")
   elsif status == "OFF"
     core.digital_write(0, "LOW")
   end 
end

但是,如果您认为此方法在同一请求中多次执行,那么您可以使用memoizationcore更改为实例变量并使用||=运算符。

def set_note
   @core ||= RubySpark::Tinker.new(ENV["COREID"])
   if status == "ON"
     @core.digital_write(0, "HIGH")
   elsif status == "OFF"
     @core.digital_write(0, "LOW")
   end 
end

答案 2 :(得分:0)

是。使用实例变量是对象保留应该可供多个方法访问的信息的设计方式。

只有该对象的实例才具有该值(如名称实例变量所暗示的那样),因此它不会对其他实例产生负面影响。

正如已经提出的那样,有些方法可以通过将部分方法抽象为另一种方法来减少重复次数。这是一个好主意,但问题的基本答案就是“是的,这就是它的用途。”