【问题标题】:Rails 3: Call back for when a certain object is pulled from the database (Mongo Mapper)Rails 3:从数据库中提取某个对象时回调(Mongo Mapper)
【发布时间】:2012-01-23 09:36:25
【问题描述】:

我需要一些可以在从数据库中提取并调用对象时触发方法的东西。例如,假设我有 Apple 类。我执行查询:

Apple.where(:name => "Delicious").first

返回

#<Apple id: 2, blah, blah, blah>

我需要一种方法(回调或其他)来调用方法,以便跟踪从数据库中提取项目的次数。任何人都可以提出这样做​​的方法吗?我正在使用 MongoDB 和 MongoMapper。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 mongodb mongomapper


    【解决方案1】:

    有一个after_find 回调在从数据库加载对象后被调用。所以:

    after_find :update_found_count
    
    def found_times
      increment!(:found_count)
    end
    

    【讨论】:

    • 很遗憾,此解决方案不适用于 Mongo Mapper,您能给我一个解决方案吗?
    • 不,抱歉,我不知道具体的修复方法。不过,提出一个不同的问题可能比编辑这个问题并可能使人们已经给你的答案变得无关紧要更有成效。
    【解决方案2】:

    假设您的模型有一个名为 access_count 的属性,您可以覆盖 initialize 来执行以下操作:

    更新: Shadwell's answer 更好;以这种方式指导您的投票。如果对某人有用,请留下以下内容。

    class Apple < ActiveRecord::Base
      def initialize *args
        super
    
        incr_access_count
      end
    
      private
      def incr_access_count
        update_attribute :access_count => access_count + 1 unless new_record?
      end
    end
    

    这是相当幼稚的,但无论如何都是可以预测的。在我看来,在你的控制器中明确地这样做会是一个更明智的举动。每次从数据库中获取记录时更新记录都会有很大的异味,很难想象在这种情况下,获取的次数会是一个有用的指标。​​

    【讨论】:

      【解决方案3】:

      一个新的工厂来覆盖默认工厂是正确的方法。

      一个例子:

      class Apple < ActiveRecord::Base
        # ...
        def self.delicious
          # increase count or other complex operations here
          where(:name => "Delicious").first
        end
        # ...
      end
      

      在这种情况下,where 是默认工厂。

      有了这个,您只需致电Apple.delicious 即可完成。

      【讨论】:

      • 我反对在这里使用.first,因为它会强制进行查询。但我认为这超出了这个问题的范围。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2014-12-16
      • 1970-01-01
      • 2019-09-07
      相关资源
      最近更新 更多