Skip to content

Instantly share code, notes, and snippets.

@rmg
Created December 5, 2012 23:08
Show Gist options
  • Save rmg/4220355 to your computer and use it in GitHub Desktop.
Save rmg/4220355 to your computer and use it in GitHub Desktop.
Sin < ActiveRecord::Base
[75] pry(main)> def_memoized(:fac) {|x| x==0?1:x*fac(x-1) }
=> #<Proc:0x000000062147a0@/home/rgraham/working/cmportal/app/models/memoized_result.rb:7 (lambda)>
[76] pry(main)> fac(5)
MemoizedResult Load (0.6ms) SELECT `memoized_results`.* FROM `memoized_results` WHERE `memoized_results`.`key` = 'Object#fac(5)' LIMIT 1
MemoizedResult Load (0.7ms) SELECT `memoized_results`.* FROM `memoized_results` WHERE `memoized_results`.`key` = 'Object#fac(4)' LIMIT 1
MemoizedResult Load (0.5ms) SELECT `memoized_results`.* FROM `memoized_results` WHERE `memoized_results`.`key` = 'Object#fac(3)' LIMIT 1
MemoizedResult Load (0.3ms) SELECT `memoized_results`.* FROM `memoized_results` WHERE `memoized_results`.`key` = 'Object#fac(2)' LIMIT 1
MemoizedResult Load (0.2ms) SELECT `memoized_results`.* FROM `memoized_results` WHERE `memoized_results`.`key` = 'Object#fac(1)' LIMIT 1
MemoizedResult Load (0.2ms) SELECT `memoized_results`.* FROM `memoized_results` WHERE `memoized_results`.`key` = 'Object#fac(0)' LIMIT 1
(0.1ms) BEGIN
SQL (0.3ms) INSERT INTO `memoized_results` (`created_at`, `key`, `result`, `updated_at`) VALUES ('2012-12-05 15:05:38', 'Object#fac(0)', '[1]', '2012-12-05 15:05:38')
(72.7ms) COMMIT
(0.1ms) BEGIN
SQL (0.4ms) INSERT INTO `memoized_results` (`created_at`, `key`, `result`, `updated_at`) VALUES ('2012-12-05 15:05:38', 'Object#fac(1)', '[1]', '2012-12-05 15:05:38')
(100.0ms) COMMIT
(0.1ms) BEGIN
SQL (0.4ms) INSERT INTO `memoized_results` (`created_at`, `key`, `result`, `updated_at`) VALUES ('2012-12-05 15:05:38', 'Object#fac(2)', '[2]', '2012-12-05 15:05:38')
(368.7ms) COMMIT
(0.1ms) BEGIN
SQL (0.4ms) INSERT INTO `memoized_results` (`created_at`, `key`, `result`, `updated_at`) VALUES ('2012-12-05 15:05:38', 'Object#fac(3)', '[6]', '2012-12-05 15:05:38')
(63.6ms) COMMIT
(0.1ms) BEGIN
SQL (0.4ms) INSERT INTO `memoized_results` (`created_at`, `key`, `result`, `updated_at`) VALUES ('2012-12-05 15:05:38', 'Object#fac(4)', '[24]', '2012-12-05 15:05:38')
(29.9ms) COMMIT
(0.2ms) BEGIN
SQL (0.5ms) INSERT INTO `memoized_results` (`created_at`, `key`, `result`, `updated_at`) VALUES ('2012-12-05 15:05:39', 'Object#fac(5)', '[120]', '2012-12-05 15:05:39')
(54.9ms) COMMIT
=> 120
[77] pry(main)> fac(5)
MemoizedResult Load (0.6ms) SELECT `memoized_results`.* FROM `memoized_results` WHERE `memoized_results`.`key` = 'Object#fac(5)' LIMIT 1
=> 120
class MemoizedResult < ActiveRecord::Base
attr_accessible :key, :result
end
class Object
def def_memoized(name, &block)
self.class.send(:define_method, name) do |*args|
args_str = args.map(&:to_s).join(',')
key = "#{self.class}##{name}(#{args_str})"
result = MemoizedResult.where(key: key).first
if result
ActiveSupport::JSON.decode(result.result).first
else
result = block.call(*args)
enc_result = ActiveSupport::JSON.encode [result]
MemoizedResult.create(key: key, result: enc_result)
result
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment