如何在Model类中访问类变量

时间:2013-11-29 14:02:24

标签: ruby-on-rails rails-console

我想定义类变量testthreshold

这样我就可以在我的Rails应用中使用Order.test, Order.threshold

但是在使用rails控制台

时我无法访问类变量

我必须误解一些问题,问题出在哪里?感谢。

class Order < ActiveRecord::Base
  @@test=123
  @@threshold = {
    VIP: 500,
    PLATINUM: 20000
  }

以下是rails console

irb(main):001:0> Order.class_variables
=> [:@@test, :@@threshold]
irb(main):002:0> Order.test
NoMethodError: private method `test' called for #<Class:0x007fe5a63ac738>

2 个答案:

答案 0 :(得分:12)

这样做:

class Order < ActiveRecord::Base
   cattr_reader :test, :threshold
   self.test = 123
   self.threshold = {
     VIP: 500,
     PLATINUM: 20000
   }
end  

Order.test

或者我使用常数:

class Order < ActiveRecord::Base
   TEST = 123
end

Order::TEST

答案 1 :(得分:4)

我只想使用类方法:

class Order < ActiveRecord::Base
  def self.test
    123
  end

  def self.threshold
    { VIP: 500, PLATINUM: 20000 }
  end
end

常量也可以使用,但是如果您已经拥有需要Order.testOrder.threshold的代码,那么您必须更改代码以调用常量。另外,Avdi Grimm给出了使用方法而不是常量in a blog post的一些很好的理由。

访问类变量的原因不会像你期望的那样工作,因为Ruby限制了对这样的变量的访问。您需要直接定义访问者方法(如self.testself.threshold),或间接使用cattr_reader之类的内容。如果您需要从外部世界写入变量,也可以使用cattr_accessor

我通常建议避免使用类变量。他们有一些unintuitive behavior