Sha256: e85d65f65f25062d74e4ad71a14b9ebb104275ad3c022021ed4c5a554b4c8729
Contents?: true
Size: 1.48 KB
Versions: 1
Compression:
Stored size: 1.48 KB
Contents
require 'active_support/concern' module Trackable extend ActiveSupport::Concern included do attr_accessor :modifier has_one :object_activity, as: :object, dependent: :destroy delegate :created_by, :updated_by, to: :object_activity, allow_nil: true after_commit :log_object_activity, on: %i[create update], if: -> { modifier.present? } scope :left_joins_object_activities, lambda { |user_types| query = left_joins(:object_activity) user_types.each do |user_type| query = query.joins(left_join_users('created_by', user_type)) .joins(left_join_users('updated_by', user_type)) end query } def self.left_join_users(action, user_type) "LEFT JOIN #{user_type.downcase.pluralize} AS #{action}_#{user_type.downcase.pluralize} " \ "ON #{action}_#{user_type.downcase.pluralize}.id = object_activities.#{action}_id " \ "AND object_activities.#{action}_type = '#{user_type}'" end private def log_object_activity object_activity = ObjectActivity.find_or_initialize_by(trackable_object) object_activity.object_id = id object_activity.created_by ||= modifier if object_activity.persisted? object_activity.updated_by = modifier object_activity.updated_at = Time.current end object_activity.save! end def trackable_object { object_id: send(self.class.trackable_column), object_type: self.class.name } end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
acts_as_trackable-0.1.0 | lib/acts_as_trackable/trackable.rb |