Module: Shared::IsData::ClassMethods
- Defined in:
- app/models/concerns/shared/is_data.rb
Instance Method Summary collapse
-
#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
#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.
52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'app/models/concerns/shared/is_data.rb', line 52 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.
45 46 47 48 |
# File 'app/models/concerns/shared/is_data.rb', line 45 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
31 32 33 |
# File 'app/models/concerns/shared/is_data.rb', line 31 def dwc_occurrence_eligible? self < Shared::IsDwcOccurrence end |
#identical(attr) ⇒ Scope
93 94 95 96 97 98 99 |
# File 'app/models/concerns/shared/is_data.rb', line 93 def identical(attr) klass = self attr = Stripper.strip_identical_attributes(klass, attr) scope = klass.where(attr) scope end |
#is_biologically_relatable? ⇒ Boolean
39 40 41 |
# File 'app/models/concerns/shared/is_data.rb', line 39 def is_biologically_relatable? self < Shared::BiologicalAssociations end |
#is_community? ⇒ Boolean
23 24 25 |
# File 'app/models/concerns/shared/is_data.rb', line 23 def is_community? self < Shared::SharedAcrossProjects ? true : false end |
#is_containable? ⇒ Boolean
27 28 29 |
# File 'app/models/concerns/shared/is_data.rb', line 27 def is_containable? self < Shared::Containable end |
#is_observable? ⇒ Boolean
35 36 37 |
# File 'app/models/concerns/shared/is_data.rb', line 35 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.
106 107 108 109 110 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 |
# File 'app/models/concerns/shared/is_data.rb', line 106 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
82 83 84 85 86 87 88 89 |
# File 'app/models/concerns/shared/is_data.rb', line 82 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 |