From 2caf3d32b757052ce8e548cada3f3bc8c6da9fd6 Mon Sep 17 00:00:00 2001
From: Teal Bauer <git@teal.is>
Date: Mon, 27 May 2024 21:20:46 +0200
Subject: [PATCH] add relevant stages relation

---
 app/models/conference.rb                           |  3 +++
 app/models/relevant_stage.rb                       |  6 ++++++
 app/models/stage.rb                                |  3 +++
 .../20240527191332_create_relevant_stages.rb       | 12 ++++++++++++
 db/schema.rb                                       | 14 +++++++++++++-
 test/fixtures/relevant_stages.yml                  |  9 +++++++++
 test/models/relevant_stage_test.rb                 |  7 +++++++
 7 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 app/models/relevant_stage.rb
 create mode 100644 db/migrate/20240527191332_create_relevant_stages.rb
 create mode 100644 test/fixtures/relevant_stages.yml
 create mode 100644 test/models/relevant_stage_test.rb

diff --git a/app/models/conference.rb b/app/models/conference.rb
index 6a6d08e..6da9c44 100644
--- a/app/models/conference.rb
+++ b/app/models/conference.rb
@@ -8,6 +8,9 @@ class Conference < ApplicationRecord
 
   validates :time_zone, presence: true, inclusion: { in: ActiveSupport::TimeZone.all.map(&:name) }
 
+  has_many :relevant_stage_links, class_name: 'RelevantStage'
+  has_many :relevant_stages, through: :relevant_stage_links, source: :stage
+
   def days
     (starts_at.to_date..ends_at.to_date)
   end
diff --git a/app/models/relevant_stage.rb b/app/models/relevant_stage.rb
new file mode 100644
index 0000000..b5914f7
--- /dev/null
+++ b/app/models/relevant_stage.rb
@@ -0,0 +1,6 @@
+class RelevantStage < ApplicationRecord
+  belongs_to :conference
+  belongs_to :stage
+
+  validates :conference_id, uniqueness: { scope: :stage_id }
+end
diff --git a/app/models/stage.rb b/app/models/stage.rb
index 0cc3b52..6470dc2 100644
--- a/app/models/stage.rb
+++ b/app/models/stage.rb
@@ -3,4 +3,7 @@ class Stage < ApplicationRecord
   has_many :sessions
 
   validates :ref_id, uniqueness: { scope: :conference_id }
+
+  has_many :relevant_stage_links, class_name: 'RelevantStage'
+  has_many :relevant_conferences, through: :relevant_stage_links, source: :conference
 end
diff --git a/db/migrate/20240527191332_create_relevant_stages.rb b/db/migrate/20240527191332_create_relevant_stages.rb
new file mode 100644
index 0000000..fba4b21
--- /dev/null
+++ b/db/migrate/20240527191332_create_relevant_stages.rb
@@ -0,0 +1,12 @@
+class CreateRelevantStages < ActiveRecord::Migration[7.1]
+  def change
+    create_table :relevant_stages do |t|
+      t.references :conference, null: false, foreign_key: true
+      t.references :stage, null: false, foreign_key: true
+
+      t.timestamps
+    end
+
+    add_index :relevant_stages, [:conference_id, :stage_id], unique: true
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index ed4b008..801a3e8 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema[7.1].define(version: 2024_05_26_165259) do
+ActiveRecord::Schema[7.1].define(version: 2024_05_27_191332) do
   create_table "assignments", force: :cascade do |t|
     t.integer "user_id", null: false
     t.integer "session_id", null: false
@@ -72,6 +72,16 @@ ActiveRecord::Schema[7.1].define(version: 2024_05_26_165259) do
     t.datetime "updated_at", null: false
   end
 
+  create_table "relevant_stages", force: :cascade do |t|
+    t.integer "conference_id", null: false
+    t.integer "stage_id", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["conference_id", "stage_id"], name: "index_relevant_stages_on_conference_id_and_stage_id", unique: true
+    t.index ["conference_id"], name: "index_relevant_stages_on_conference_id"
+    t.index ["stage_id"], name: "index_relevant_stages_on_stage_id"
+  end
+
   create_table "revision_sets", force: :cascade do |t|
     t.integer "conference_id", null: false
     t.datetime "created_at", null: false
@@ -260,6 +270,8 @@ ActiveRecord::Schema[7.1].define(version: 2024_05_26_165259) do
 
   add_foreign_key "assignments", "sessions"
   add_foreign_key "assignments", "users"
+  add_foreign_key "relevant_stages", "conferences"
+  add_foreign_key "relevant_stages", "stages"
   add_foreign_key "revision_sets", "conferences"
   add_foreign_key "revisions", "conferences"
   add_foreign_key "session_speakers", "sessions"
diff --git a/test/fixtures/relevant_stages.yml b/test/fixtures/relevant_stages.yml
new file mode 100644
index 0000000..684efd1
--- /dev/null
+++ b/test/fixtures/relevant_stages.yml
@@ -0,0 +1,9 @@
+# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html
+
+one:
+  conference: one
+  stage: one
+
+two:
+  conference: two
+  stage: two
diff --git a/test/models/relevant_stage_test.rb b/test/models/relevant_stage_test.rb
new file mode 100644
index 0000000..e9e09d8
--- /dev/null
+++ b/test/models/relevant_stage_test.rb
@@ -0,0 +1,7 @@
+require "test_helper"
+
+class RelevantStageTest < ActiveSupport::TestCase
+  # test "the truth" do
+  #   assert true
+  # end
+end
-- 
GitLab