我有一段代码。那是:
class User < ActiveRecord::Base
def configuration_with_cache
Rails.cache.fetch("user_#{id}_configuration") do
configuration_without_cache
end
end
alias_method_chain :configuration, :cache
end
我想删除臭名昭着的alias_method_chain
,所以我决定重构它。这是我的版本:
class User < ActiveRecord::Base
def configuration
Rails.cache.fetch("#{id}_agency_configuration") do
super
end
end
end
但它不起作用。 超级进入新范围。我怎么能让它运作?我得到了TypeError: can't cast Class
,我误解了它。
答案 0 :(得分:-1)
你可以在块中使用Super。
请看到这个,任何问题都让我知道。
将其称为“超级”将通过该块。 超级(* args,&amp; block)'也将。
答案 1 :(得分:-1)
首先,在块中调用super
确实的行为符合您的要求。必须是您的控制台处于损坏状态(或其他)。
class User
def professional?
Rails.cache.fetch("user_professional") do
puts 'running super'
super
end
end
end
User.new.professional?
# >> running super
# => false
User.new.professional?
# => false
接下来,这看起来像Module#prepend
was made to help with。
module Cacher
def with_rails_cache(method)
mod = Module.new do
define_method method do
cache_key = "my_cache_for_#{method}"
Rails.cache.fetch(cache_key) do
puts "filling the cache"
super()
end
end
end
prepend mod
end
end
class User
extend Cacher
with_rails_cache :professional?
end
User.new.professional?
# >> filling the cache
# => false
User.new.professional?
# => false