如何在ActiveRecord的实例之间保留一个Set?

时间:2018-02-01 19:46:18

标签: ruby-on-rails ruby activerecord

我有一个ActiveRecord类,多个类继承。

该课程有一个方法:

def self.doSomeEvaluation(*args)
  #do some evaluation
end

我想保存并添加每个子类的每个doSomeEvaluation调用的参数。 我还希望它独立于该子类的当前实例。此Set应该是ActiveRecord类的每个子类的个体,并且应该保存在该已实现的子类的不同实例之间。

当我尝试在doSomeEvaluation来电时设置一套,它与此类似:

def self.doSomeEvaluation(*args)
  args.each do |arg|
    @set.add(arg)
    #do some evaluation
end

使用此实现,我无法实现此类行为,因为在给定子类的实例之间,Set的值将丢失。我还试图将set保持为类变量,但我仍然无法实现上述行为:

def self.doSomeEvaluation(*args)
  args.each do |arg|
    @@set.add(arg)
  #do some evaluation
end

还尝试使用ActiveRecord属性,但它作为常量工作,不允许这种行为。

有关如何实现此行为的任何想法? 从逻辑的角度来看这种行为是否可以接受?

1 个答案:

答案 0 :(得分:1)

您已接近解决方案

def self.doSomeEvaluation(*args)
  @@set ||= {}
  @@set[self] ||= Set.new
  args.each { |arg| @@set[self] << arg }

  #do some evaluation
end

由于@@set类变量,因此它将在您想要的所有类实例之间共享。但是你也想区分不同的类。为此,您需要将其作为哈希,将当前类(self)作为键。