aboutsummaryrefslogtreecommitdiffstats
path: root/app/models
diff options
context:
space:
mode:
authorRobert2017-10-05 08:51:40 +0200
committerRobert2017-10-05 08:53:48 +0200
commit27b5695fe6be33f23e87242a617ba9bd751fac28 (patch)
treee4d78a34336112360c1a2c9d4217ec2782ab60cd /app/models
parent14eb03b2e2485985e6956375a82edbcf71f01bb4 (diff)
downloadchouette-core-0000-proposal-through_if.tar.bz2
Proposal for DB consistency enforcment0000-proposal-through_if
Diffstat (limited to 'app/models')
-rw-r--r--app/models/compliance_control.rb18
-rw-r--r--app/models/concerns/u_name_it.rb29
2 files changed, 39 insertions, 8 deletions
diff --git a/app/models/compliance_control.rb b/app/models/compliance_control.rb
index 52838ef74..124124365 100644
--- a/app/models/compliance_control.rb
+++ b/app/models/compliance_control.rb
@@ -1,7 +1,15 @@
class ComplianceControl < ActiveRecord::Base
extend Enumerize
- belongs_to :compliance_control_set
- belongs_to :compliance_control_block
+ # belongs_to :compliance_control_set
+ # belongs_to :compliance_control_block
+ # validate def coherent_control_set
+ # return true if compliance_control_block_id.nil?
+ # ids = [compliance_control_block.compliance_control_set_id, compliance_control_set_id]
+ # return true if ids.first == ids.last
+ # errors.add(:coherent_control_set, I18n.t('compliance_controls.errors.incoherent_control_sets', indirect_set_id: ids.first, direct_set_id: ids.last))
+ # end
+ extend UNameIt
+ belongs_to_through_if :compliance_control_set, parent: :compliance_control_block, as: :consistent_control_set
enumerize :criticity, in: %i(info warning error), scope: true, default: :info
hstore_accessor :control_attributes, {}
@@ -12,12 +20,6 @@ class ComplianceControl < ActiveRecord::Base
validates :origin_code, presence: true
validates :compliance_control_set, presence: true
- validate def coherent_control_set
- return true if compliance_control_block_id.nil?
- ids = [compliance_control_block.compliance_control_set_id, compliance_control_set_id]
- return true if ids.first == ids.last
- errors.add(:coherent_control_set, I18n.t('compliance_controls.errors.incoherent_control_sets', indirect_set_id: ids.first, direct_set_id: ids.last))
- end
class << self
def create *args
diff --git a/app/models/concerns/u_name_it.rb b/app/models/concerns/u_name_it.rb
new file mode 100644
index 000000000..101887647
--- /dev/null
+++ b/app/models/concerns/u_name_it.rb
@@ -0,0 +1,29 @@
+module UNameIt
+ # Options as e.g. different key names and options for each
+ # belongs_to can be defined on an AS NEEDED basis...
+ def belongs_to_through_if( grand_parent_klass_sym,
+ parent:,
+ as: )
+ belongs_to grand_parent_klass_sym
+ validates grand_parent_klass_sym, presence: true
+ belongs_to parent
+
+ validate do
+ parent_instance = send(parent)
+ unless parent_instance.nil?
+
+ direct_grand_parent_id = self["#{grand_parent_klass_sym}_id"]
+ indirect_grand_parent_id = parent_instance["#{grand_parent_klass_sym}_id"]
+ unless direct_grand_parent_id == indirect_grand_parent_id
+
+ errors.add(
+ as,
+ I18n.t([self.class.name.underscore.pluralize, 'errors', as].join('.'),
+ direct_id: direct_grand_parent_id,
+ indirect_id: indirect_grand_parent_id))
+ end
+ end
+ end
+ end
+
+end