Module: Shared::IsData::ClassMethods
- Defined in:
- app/models/concerns/shared/is_data.rb
Instance Method Summary collapse
- #auto_uuids? ⇒ Boolean
-
#batch_update_attribute(ids: [], attribute: nil, value: nil) ⇒ Boolean
Use update vs.
-
#core_attributes ⇒ Array of String
Only the non-cached and non-housekeeping column names.
- #dwc_occurrence_eligible? ⇒ Boolean
- #identical(attr) ⇒ Scope
- #is_biologically_relatable? ⇒ Boolean
- #is_community? ⇒ Boolean
- #is_containable? ⇒ Boolean
- #is_observable? ⇒ Boolean
-
#related_summary(ids) ⇒ Object
Hash { restrict: {}, destroy: {} }.
- #similar(attr) ⇒ Scope
Instance Method Details
#auto_uuids? ⇒ Boolean
44 45 46 |
# File 'app/models/concerns/shared/is_data.rb', line 44 def auto_uuids? self < Shared::AutoUuid end |
#batch_update_attribute(ids: [], attribute: nil, value: nil) ⇒ Boolean
Returns use update vs. a set of ids, but require the update to pass for all or none.
57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'app/models/concerns/shared/is_data.rb', line 57 def batch_update_attribute(ids: [], attribute: nil, value: nil) return false if ids.empty? || attribute.nil? || value.nil? begin self.transaction do self.where(id: ids).each do |li| li.update(attribute => value) end end rescue return false end true end |
#core_attributes ⇒ Array of String
Returns only the non-cached and non-housekeeping column names.
50 51 52 53 |
# File 'app/models/concerns/shared/is_data.rb', line 50 def core_attributes # was data_attributes column_names.reject { |c| %w{id project_id created_by_id updated_by_id created_at updated_at} .include?(c) || c =~ /^cached/ } end |
#dwc_occurrence_eligible? ⇒ Boolean
32 33 34 |
# File 'app/models/concerns/shared/is_data.rb', line 32 def dwc_occurrence_eligible? self < Shared::IsDwcOccurrence end |
#identical(attr) ⇒ Scope
98 99 100 101 102 103 104 |
# File 'app/models/concerns/shared/is_data.rb', line 98 def identical(attr) klass = self attr = Stripper.strip_identical_attributes(klass, attr) scope = klass.where(attr) #.where.not(id:) scope end |
#is_biologically_relatable? ⇒ Boolean
40 41 42 |
# File 'app/models/concerns/shared/is_data.rb', line 40 def is_biologically_relatable? self < Shared::BiologicalAssociations end |
#is_community? ⇒ Boolean
24 25 26 |
# File 'app/models/concerns/shared/is_data.rb', line 24 def is_community? self < Shared::SharedAcrossProjects ? true : false end |
#is_containable? ⇒ Boolean
28 29 30 |
# File 'app/models/concerns/shared/is_data.rb', line 28 def is_containable? self < Shared::Containable end |
#is_observable? ⇒ Boolean
36 37 38 |
# File 'app/models/concerns/shared/is_data.rb', line 36 def is_observable? self < Shared::Observations end |
#related_summary(ids) ⇒ Object
Returns Hash { restrict: {}, destroy: {} }
Summarizes the count of records that will be destroyed if these ids are destroyed, or records that will prevent destruction.
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'app/models/concerns/shared/is_data.rb', line 111 def (ids) h = { restrict: {}, destroy: {} } objects = self.where(id: ids) base = self.table_name.to_sym [ self.reflect_on_all_associations(:has_many), self.reflect_on_all_associations(:has_one) ].each do |rt| rt.each do |r| d = r..dig(:dependent) next if d.nil? c = nil if r.type c = r.klass.where(r.type.to_sym => self.name, r.type.gsub('_type', '_id').to_sym => objects.map(&:id)).count else c = r.klass.where(r.foreign_key.to_sym => objects.map(&:id)).count end if c > 0 case d when :destroy h[:destroy][r.name] = c when :restrict_with_error h[:restrict][r.name] = c end end end end h end |
#similar(attr) ⇒ Scope
87 88 89 90 91 92 93 94 |
# File 'app/models/concerns/shared/is_data.rb', line 87 def similar(attr) klass = self attr = Stripper.strip_similar_attributes(klass, attr) attr = attr.select { |_kee, val| val.present? } scope = klass.where(attr) scope end |