【问题标题】:How to keep a Set between instances of an ActiveRecord?如何在 ActiveRecord 的实例之间保留一个 Set?
【发布时间】:2018-02-02 05:24:51
【问题描述】:

我有一个多个类继承的 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 的值会丢失。我也尝试将集合保留为类变量,但仍然无法实现上述行为:

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

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

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

【问题讨论】:

  • 你在做memoization吗?
  • @SergioTulentsev 我认为类似的东西。在这篇文章中阅读它:justinweiss.com/articles/… 这似乎与我想要实现的目标相似。
  • 这个“我无法实现这样的行为”究竟是什么意思?
  • @engineersmnky,我的意思是:在给定子类的实例之间,Set 的值丢失了。我用这些信息编辑了问题,谢谢!
  • @FilipeFreire:“从某种意义上说,在给定子类的实例之间,Set 的值会丢失。” - 你知道这句话,“一个sn-p的代码胜过一千个单词”吗? :)

标签: ruby-on-rails ruby activerecord


【解决方案1】:

你的解决方案很接近

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

  #do some evaluation
end

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2012-05-15
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多