【问题标题】:accessing instance methods inside a ruby/Rails class but outside an instance method在 ruby​​/Rails 类内部但在实例方法外部访问实例方法
【发布时间】:2013-02-15 05:51:54
【问题描述】:

我正在尝试将活动 Record 对象关联的计数发送到 redis-object gem

class Post > ActiveRecord::Base
    has_many :comments

   include Redis::Objects
   value :redis_comment_count, :default => self.comments.count
end

PS:设置 :default => "string" 效果很好

但这不起作用,因为代码中那个位置的 self (它不在方法定义中)指的是 Post 的类定义,而不是 post 实例本身。我试图弄清楚这是否有可能做到。

我说得有道理吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    不幸的是,您似乎不得不为您的 cmets 设置保存回调。我浏览了 gem,它看起来还不支持传递 proc 以便稍后调用(请参阅here)。

    顺便说一句

    除了您调用的是类方法而不是实例方法这一事实之外,self.comments.count 会在加载类时评估,就在您调用时:

     value :redis_comment_count, :default => self.comments.count
    
     # This becomes:
     # value :redis_comment_count, :default => 1  # Example
    

    并不是每次 redis-objects gem 都使用value_options[:default]

    如果你的类不断被重新加载,这个值将不断被重新评估,就像开发环境的默认设置一样。但是,在我们通常启用 cache_classes 的生产环境中,只有在 Rails 应用程序启动并加载您的模型时才会评估此值。

    如果支持,传递 proc 将起作用。

    【讨论】:

    • 我会向 proc 传递什么?
    • 但是(尚)不支持传递 proc。 :-)
    • 我知道......我只是好奇如果我这样做了我会传递什么。我要分叉 gem 并让它以这种方式工作
    【解决方案2】:

    你试过了吗?

    value :redis_comment_count, default: -> { self.comments.count}
    

    这是使用 Ruby 1.9 的 new hash syntax 以及 'stab' 或 lambda operator

    【讨论】:

    • 是的。我使用了默认的旧 ruby​​ 样式: lambda { self.cmets.count } 并返回一个 proc,这对我不起作用,我需要它来返回实际值,但是当我尝试 lambda { self.cmets. count }.call 当我点击重新加载时,我收到错误“NoMethodError: undefined method `cmets' for #<0x007fa63b841708>
    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多