扩展ActiveRecord :: Base无法正常工作

时间:2015-01-20 11:29:19

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我正在尝试使用一些审核功能扩展ActiveRecord :: Base。当用户保存模型时,我用他们的用户ID更新两列 - created_by_user_id和/或updated_by_user_id。 user_id来自RequestRegistry。

我无法让它发挥作用。请参阅下面的代码。

module AuditTrail
  extend ActiveSupport::Concern

  included do
    before_save :update_audit_fields
  end

  private

  def update_audit_fields
    puts "Updating audit fields" # note this is not being printed out!
    fields_to_update.each do |column|
      column = column.to_s
      # if has_attribute?(column)
      # self[column] = RequestRegistry.current_user.id
      puts "Updating #{column} with user_id some user id"
      # end
    end
  end

  def fields_to_update
    if self.new_record?
      audit_fields
    else
      update_audit_fields
    end
  end

  def audit_fields
    create_audit_fields + update_audit_fields
  end

  def update_audit_fields
    [:updated_by_user_id]
  end

  def create_audit_fields
    [:created_by_user_id]
  end
end

ActiveRecord::Base.send(:include, AuditTrail)


class RequestRegistry
  extend ActiveSupport::PerThreadRegistry

  attr_accessor :current_user
end

当我将其简化为下面的代码时。 puts语句打印出第一段代码中的任何内容都没有打印出来。此外,控制台未在代码中显示任何中断或错误。

module AuditTrail
  extend ActiveSupport::Concern

  included do
    before_save :update_audit_fields
  end

  private

  def update_audit_fields
    puts "Updating audit fields"
  end
end

ActiveRecord::Base.send(:include, AuditTrail)

我试图慢慢扩展更简单的版本,但它会随机停止工作。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

您复制方法update_audit_fields的定义。 在这种情况下,第二个定义用puts覆盖你的方法。