diff options
| author | Robert | 2017-10-05 08:51:40 +0200 | 
|---|---|---|
| committer | Robert | 2017-10-05 08:53:48 +0200 | 
| commit | 27b5695fe6be33f23e87242a617ba9bd751fac28 (patch) | |
| tree | e4d78a34336112360c1a2c9d4217ec2782ab60cd | |
| parent | 14eb03b2e2485985e6956375a82edbcf71f01bb4 (diff) | |
| download | chouette-core-27b5695fe6be33f23e87242a617ba9bd751fac28.tar.bz2 | |
Proposal for DB consistency enforcment0000-proposal-through_if
| -rw-r--r-- | app/models/compliance_control.rb | 18 | ||||
| -rw-r--r-- | app/models/concerns/u_name_it.rb | 29 | ||||
| -rw-r--r-- | config/locales/compliance_controls.en.yml | 2 | ||||
| -rw-r--r-- | config/locales/compliance_controls.fr.yml | 2 | ||||
| -rw-r--r-- | spec/models/compliance_control_spec.rb | 2 | 
5 files changed, 42 insertions, 11 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 diff --git a/config/locales/compliance_controls.en.yml b/config/locales/compliance_controls.en.yml index ee98367cf..d583243f3 100644 --- a/config/locales/compliance_controls.en.yml +++ b/config/locales/compliance_controls.en.yml @@ -1,7 +1,7 @@  en:    compliance_controls:      errors: -      incoherent_control_sets: "Directly associated control_set (id: %{direct_set_id}) and indirectly associated one (id: %{indirect_set_id}) differ" +      consistent_control_set: "Directly associated control_set (id: %{direct_id}) and indirectly associated one (id: %{indirect_id}) differ"      show:        title: "Compliance control"      index: diff --git a/config/locales/compliance_controls.fr.yml b/config/locales/compliance_controls.fr.yml index 0f3e586bf..7f230f8bb 100644 --- a/config/locales/compliance_controls.fr.yml +++ b/config/locales/compliance_controls.fr.yml @@ -1,7 +1,7 @@  fr:    compliance_controls:      errors: -      incoherent_control_sets: "ControlSet associé directement (id: %{direct_set_id}) et indirectement (id: %{indirect_set_id}) ne sont pas égeaux" +      consistent_control_set: "ControlSet associé directement (id: %{direct_id}) et indirectement (id: %{indirect_id}) ne sont pas égeaux"      show:        title: "Jeu de controle"      index: diff --git a/spec/models/compliance_control_spec.rb b/spec/models/compliance_control_spec.rb index 7c58eaf3e..731f84d24 100644 --- a/spec/models/compliance_control_spec.rb +++ b/spec/models/compliance_control_spec.rb @@ -44,7 +44,7 @@ RSpec.describe ComplianceControl, type: :model do          compliance_control_set_id: create( :compliance_control_set ).id        expect(compliance_control).to_not be_valid        selected_error_message = -        compliance_control.errors.messages[:coherent_control_set].grep(%r{ControlSet associé}) +        compliance_control.errors.messages[:consistent_control_set].grep(%r{ControlSet associé})        expect( selected_error_message ).to_not be_empty      end    end | 
