Method: Sequel::Postgres::StaticCacheUpdater#listen_for_static_cache_updates
- Defined in:
- lib/sequel/extensions/pg_static_cache_updater.rb
permalink #listen_for_static_cache_updates(models, opts = OPTS) ⇒ Object
Listen on the notification channel for changes to any of tables for the models given in a new thread. If notified about a change to one of the tables, reload the cache for the related model. Options given are also passed to Database#listen.
Note that this implementation does not currently support multiple models that use the same underlying table.
Options:
- :channel_name
-
Override the channel name to use.
- :before_thread_exit
-
An object that responds to
call
that is called before the the created thread exits.
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/sequel/extensions/pg_static_cache_updater.rb', line 117 def listen_for_static_cache_updates(models, opts=OPTS) raise Error, "this database object does not respond to listen, use the postgres adapter with the pg driver" unless respond_to?(:listen) models = [models] unless models.is_a?(Array) raise Error, "array of models to listen for changes cannot be empty" if models.empty? oid_map = {} models.each do |model| raise Error, "#{model.inspect} does not use the static_cache plugin" unless model.respond_to?(:load_cache) oid_map[get(regclass_oid(model.dataset.first_source_table))] = model end Thread.new do begin listen(opts[:channel_name]||default_static_cache_update_name, {:loop=>true}.merge!(opts)) do |_, _, oid| if model = oid_map[oid.to_i] model.load_cache end end ensure opts[:before_thread_exit].call if opts[:before_thread_exit] end end end |