Module: ASModel::SequelHooks
- Defined in:
- backend/app/model/ASModel_sequel.rb
Overview
Hooks for firing behaviour on Sequel::Model events
Defined Under Namespace
Modules: BlobHack
Class Method Summary collapse
Instance Method Summary collapse
-
#_save_refresh ⇒ Object
We can save quite a lot of database chatter by only refreshing our top-level records upon save.
-
#around_save ⇒ Object
-
#before_create ⇒ Object
-
#before_save ⇒ Object
-
#before_update ⇒ Object
Class Method Details
.included(base) ⇒ Object
[View source]
6 7 8 |
# File 'backend/app/model/ASModel_sequel.rb', line 6 def self.included(base) base.extend(BlobHack) end |
Instance Method Details
#_save_refresh ⇒ Object
We can save quite a lot of database chatter by only refreshing our top-level records upon save. Pure-nested records don’t need refreshing, so skip them.
14 15 16 17 18 |
# File 'backend/app/model/ASModel_sequel.rb', line 14 def _save_refresh if self.class.is_a?(ASModel) && self.class.top_level? _refresh(this.opts[:server] ? this : this.server(:default)) end end |
#around_save ⇒ Object
[View source]
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'backend/app/model/ASModel_sequel.rb', line 118 def around_save values_to_reapply = {} self.class.blob_columns_to_fix.each do |column| if self[column] values_to_reapply[column] = self[column] self[column] = "around_save_placeholder" end end ret = super if !values_to_reapply.empty? ps = self.class.dataset.where(:id => self.id).prepare(:update, :update_blobs, Hash[values_to_reapply.keys.map {|c| [c, :"$#{c}"]}]) ps.call(Hash[values_to_reapply.map {|k, v| [k, DB.blobify(v)]}]) self.refresh end ret end |
#before_create ⇒ Object
[View source]
20 21 22 23 24 25 26 27 |
# File 'backend/app/model/ASModel_sequel.rb', line 20 def before_create if RequestContext.get(:current_username) self.created_by = self.last_modified_by = RequestContext.get(:current_username) end self.create_time = Time.now self.system_mtime = self.user_mtime = Time.now super end |
#before_save ⇒ Object
[View source]
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'backend/app/model/ASModel_sequel.rb', line 29 def before_save # ANW-617: most of the sluggable classes run their slug code via calls to auto_generate on the slug property. # The code in this hook ensures that: # - all slugs are cleaned. # - if we end up autogenning an empty slug, we turn is_slug_auto off for that entity # - the special cases for Agents are handled # - ignores setting for use_human_readable_urls for repositories which have # slugs generated regardless of the setting for use_human_readable_urls if AppConfig[:use_human_readable_urls] # Special case for generating slugs for Agents by name # This special case is necessary because the NameAgent classes don't have a slug field themselves, but they have the data we need to generate the slug. if SlugHelpers.is_agent_name_type?(self.class) && SlugHelpers.slug_data_updated?(self) && SlugHelpers.is_slug_auto_enabled?(self) && !AppConfig[:auto_generate_slugs_with_id] SlugHelpers.generate_slug_for_agent_name!(self) end # For all types # If the slug has changed manually, then make sure it's cleaned and deduped. if self[:slug] && (self.column_changed?(:slug) || !self.exists?) && !SlugHelpers::is_slug_auto_enabled?(self) cleaned_slug = SlugHelpers.clean_slug(self[:slug]) self[:slug] = SlugHelpers.run_dedupe_slug(cleaned_slug) end # For all non-agent types except repositories that have a slug field # If the slug is empty at this point and is_slug_auto is enabled, # then we didn't have enough data to generate one, so we'll turn # is_slug_auto off if SlugHelpers.base_sluggable_class?(self.class) && (self[:slug].nil? || self[:slug].empty?) && !SlugHelpers.is_agent_type?(self.class) && SlugHelpers.is_slug_auto_enabled?(self) self[:is_slug_auto] = 0 end # Repositories must always have a slug so, if repository and # there is no slug, auto generate a repo slug based on repo_code. if self.class == Repository && (self[:slug].nil? || self[:slug].empty?) cleaned_slug = SlugHelpers.clean_slug(self[:repo_code]) self[:slug] = SlugHelpers.run_dedupe_slug(cleaned_slug) self[:is_slug_auto] = 1 end # This block is the same as above, but a special case for Agent classes when generating by ID only. # We can't autogen an empty slug for an agent based on name, because the primary name field is required. # Running this code when generating by name breaks things because autogen is flipped off for the agent and then the name record update does't run like it should if SlugHelpers.is_agent_type?(self.class) && AppConfig[:auto_generate_slugs_with_id] == true && (self[:slug].nil? || self[:slug].empty?) && SlugHelpers.is_slug_auto_enabled?(self) self[:is_slug_auto] = 0 end elsif self.class == Repository if (!self.exists? && (self[:slug].nil? || self[:slug].empty?)) cleaned_slug = SlugHelpers.clean_slug(self[:repo_code]) self[:slug] = SlugHelpers.run_dedupe_slug(cleaned_slug) self[:is_slug_auto] = 1 elsif !SlugHelpers::is_slug_auto_enabled?(self) && !self[:slug].nil? && !self[:slug].empty? && self.column_changed?(:slug) cleaned_slug = SlugHelpers.clean_slug(self[:slug]) self[:slug] = SlugHelpers.run_dedupe_slug(cleaned_slug) end end end |
#before_update ⇒ Object
[View source]
109 110 111 112 113 114 115 |
# File 'backend/app/model/ASModel_sequel.rb', line 109 def before_update if RequestContext.get(:current_username) self.last_modified_by = RequestContext.get(:current_username) end self.system_mtime = Time.now super end |