diff --git a/app/models/concerns/sdg/relatable.rb b/app/models/concerns/sdg/relatable.rb index f596fcb31c4..636feca7395 100644 --- a/app/models/concerns/sdg/relatable.rb +++ b/app/models/concerns/sdg/relatable.rb @@ -14,7 +14,6 @@ module SDG::Relatable through: :sdg_relations, source: :related_sdg, source_type: "SDG::Target" - alias_method :sdg_targets=, :sdg_global_targets= has_one :sdg_review, as: :relatable, dependent: :destroy, class_name: "SDG::Review" end @@ -57,6 +56,15 @@ def sdg_targets sdg_global_targets + sdg_local_targets end + def sdg_targets=(targets) + global_targets, local_targets = targets.partition { |target| target.class.name == "SDG::Target" } + + transaction do + self.sdg_global_targets = global_targets + self.sdg_local_targets = local_targets + end + end + def sdg_goal_list sdg_goals.order(:code).map(&:code).join(", ") end diff --git a/spec/models/sdg/relatable_spec.rb b/spec/models/sdg/relatable_spec.rb index 2c3d2f4fd3f..4dd6aea511f 100644 --- a/spec/models/sdg/relatable_spec.rb +++ b/spec/models/sdg/relatable_spec.rb @@ -69,6 +69,18 @@ end end + describe "#sdg_targets=" do + it "assigns both targets and local targets" do + global_targets = [SDG::Target[2.2], SDG::Target[1.2]] + local_targets = %w[2.2.1 3.1.1].map { |code| create(:sdg_local_target, code: code) } + + relatable.sdg_targets = global_targets + local_targets + + expect(relatable.sdg_global_targets).to match_array global_targets + expect(relatable.sdg_local_targets).to match_array local_targets + end + end + describe "#sdg_local_targets" do it "can assign local targets to a model" do relatable.sdg_local_targets = [local_target, another_local_target]