Как делает один - без наследования - переопределяют метод класса и называют оригинал из нового метода?

Если числовой id подойдет, как насчет просто использовать row_number():

SELECT CAST(ROW_NUMBER() OVER (ORDER BY COL1, COL2, COL3) as VARCHAR(255)) as unique_id,
       QUERY.*
FROM (SELECT DISTICT COL1, COL2, COL3
      FROM view a
      WHERE conditions ....
     ) QUERY
WHERE CONDITIONS...
LIMIT 20 OFFSET 0
9
задан sblundy 13 November 2008 в 19:52
поделиться

4 ответа

Это довольно твердо получить Вашу голову вокруг иногда, но необходимо открыть "eigenclass", который является одиночным элементом, связанным с определенным объектом класса. синтаксис для этого является классом <<сам, действительно... заканчиваются.

class Time
  alias :old_strftime :strftime

  def strftime
    puts "got here"
    old_strftime
  end
end

class Time
  class << self
    alias :old_now :now
    def now
      puts "got here too"
      old_now
    end
  end
end

t = Time.now
puts t.strftime
12
ответ дан 4 December 2019 в 13:50
поделиться

Методы класса являются просто методами. Я настоятельно рекомендую против этого, но у Вас есть два эквивалентных варианта:

class Time
  class << self
    alias_method :old_time_now, :now

    def now
      my_now = old_time_now
      # new code
      my_now
    end
  end
end

class << Time
  alias_method :old_time_now, :now

  def now
    my_now = old_time_now
    # new code
    my_now
  end
end
2
ответ дан 4 December 2019 в 13:50
поделиться

Если Вы должны переопределить его для тестирования (причина, я обычно хочу переопределить Time.now), Ruby дразнить/блокировать платформы, сделает это для Вас легко. Например, с RSpec (который использует flexmock):

Time.stub!(:now).and_return(Time.mktime(1970,1,1))

Между прочим, я настоятельно рекомендую предотвращение потребности погасить Time.now путем предоставления классам сверхъездовых часов:

class Foo
  def initialize(clock=Time)
    @clock = clock
  end

  def do_something
    time = @clock.now
    # ...
  end
end
1
ответ дан 4 December 2019 в 13:50
поделиться

Я пытался понять, как переопределить метод экземпляра с помощью модулей.

module Mo
  def self.included(base)
    base.instance_eval do
      alias :old_time_now :now
      def now
        my_now = old_time_now
        puts 'overrided now'
        # new code
        my_now
      end
    end
  end
end
Time.send(:include, Mo) unless Time.include?(Mo)

> Time.now
overrided now
=> Mon Aug 02 23:12:31 -0500 2010
0
ответ дан 4 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: