Если числовой 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
Это довольно твердо получить Вашу голову вокруг иногда, но необходимо открыть "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
Методы класса являются просто методами. Я настоятельно рекомендую против этого, но у Вас есть два эквивалентных варианта:
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
Если Вы должны переопределить его для тестирования (причина, я обычно хочу переопределить 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
Я пытался понять, как переопределить метод экземпляра с помощью модулей.
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