diff --git a/app/models/concerns/cardable.rb b/app/models/concerns/cardable.rb new file mode 100644 index 000000000..e18435e72 --- /dev/null +++ b/app/models/concerns/cardable.rb @@ -0,0 +1,7 @@ +module Cardable + extend ActiveSupport::Concern + + included do + has_many :cards, class_name: "Widget::Card", as: :cardable, dependent: :destroy + end +end diff --git a/app/models/site_customization/page.rb b/app/models/site_customization/page.rb index 03c4bcccc..2c2c84fd5 100644 --- a/app/models/site_customization/page.rb +++ b/app/models/site_customization/page.rb @@ -1,10 +1,6 @@ class SiteCustomization::Page < ApplicationRecord VALID_STATUSES = %w[draft published].freeze - has_many :cards, - class_name: "Widget::Card", - foreign_key: "site_customization_page_id", - inverse_of: :page - + include Cardable translates :title, touch: true translates :subtitle, touch: true translates :content, touch: true diff --git a/app/models/widget/card.rb b/app/models/widget/card.rb index 0b8ce68a3..fa8b2f8e7 100644 --- a/app/models/widget/card.rb +++ b/app/models/widget/card.rb @@ -1,9 +1,6 @@ class Widget::Card < ApplicationRecord include Imageable - belongs_to :page, - class_name: "SiteCustomization::Page", - foreign_key: "site_customization_page_id", - inverse_of: :cards + belongs_to :cardable, polymorphic: true translates :label, touch: true translates :title, touch: true @@ -18,6 +15,6 @@ class Widget::Card < ApplicationRecord end def self.body - where(header: false, site_customization_page_id: nil).order(:created_at) + where(header: false, cardable_id: nil).order(:created_at) end end diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 4bc1f098f..197707c97 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -271,7 +271,7 @@ resolve "Audit" do |audit| end resolve "Widget::Card" do |card, options| - [*resource_hierarchy_for(card.page), card] + [*resource_hierarchy_for(card.cardable), card] end resolve "Budget::Group" do |group, options| diff --git a/db/migrate/20210106132909_make_cards_polymorphic.rb b/db/migrate/20210106132909_make_cards_polymorphic.rb new file mode 100644 index 000000000..fe49baa92 --- /dev/null +++ b/db/migrate/20210106132909_make_cards_polymorphic.rb @@ -0,0 +1,8 @@ +class MakeCardsPolymorphic < ActiveRecord::Migration[5.2] + def change + change_table :widget_cards do |t| + t.rename :site_customization_page_id, :cardable_id + t.string :cardable_type, default: "SiteCustomization::Page" + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 6a67f083f..3165e920f 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.define(version: 2020_12_16_132642) do +ActiveRecord::Schema.define(version: 2021_01_06_132909) do # These are extensions that must be enabled in order to support this database enable_extension "pg_trgm" @@ -1647,9 +1647,10 @@ ActiveRecord::Schema.define(version: 2020_12_16_132642) do t.boolean "header", default: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "site_customization_page_id" + t.integer "cardable_id" t.integer "columns", default: 4 - t.index ["site_customization_page_id"], name: "index_widget_cards_on_site_customization_page_id" + t.string "cardable_type", default: "SiteCustomization::Page" + t.index ["cardable_id"], name: "index_widget_cards_on_cardable_id" end create_table "widget_feeds", id: :serial, force: :cascade do |t| diff --git a/spec/models/widget/card_spec.rb b/spec/models/widget/card_spec.rb index e7b01ddfe..70bb3eb93 100644 --- a/spec/models/widget/card_spec.rb +++ b/spec/models/widget/card_spec.rb @@ -34,7 +34,7 @@ describe Widget::Card do header = create(:widget_card, header: true) card1 = create(:widget_card, header: false) card2 = create(:widget_card, header: false) - page_card = create(:widget_card, header: false, page: create(:site_customization_page)) + page_card = create(:widget_card, header: false, cardable: create(:site_customization_page)) expect(Widget::Card.body).to match_array [card1, card2] expect(Widget::Card.body).not_to include(header) diff --git a/spec/routing/polymorphic_routes_spec.rb b/spec/routing/polymorphic_routes_spec.rb index 7874b0ac1..b0a601b77 100644 --- a/spec/routing/polymorphic_routes_spec.rb +++ b/spec/routing/polymorphic_routes_spec.rb @@ -172,7 +172,7 @@ describe "Polymorphic routes" do it "routes site customization page widget cards" do page = create(:site_customization_page) - card = create(:widget_card, page: page) + card = create(:widget_card, cardable: page) expect(admin_polymorphic_path(card)).to eq admin_site_customization_page_widget_card_path(page, card) end diff --git a/spec/system/admin/widgets/cards_spec.rb b/spec/system/admin/widgets/cards_spec.rb index 444968b7d..03ea2c2be 100644 --- a/spec/system/admin/widgets/cards_spec.rb +++ b/spec/system/admin/widgets/cards_spec.rb @@ -175,9 +175,9 @@ describe "Cards", :admin do end scenario "Show" do - card_1 = create(:widget_card, page: custom_page, title: "Card large", columns: 8) - card_2 = create(:widget_card, page: custom_page, title: "Card medium", columns: 4) - card_3 = create(:widget_card, page: custom_page, title: "Card small", columns: 2) + card_1 = create(:widget_card, cardable: custom_page, title: "Card large", columns: 8) + card_2 = create(:widget_card, cardable: custom_page, title: "Card medium", columns: 4) + card_3 = create(:widget_card, cardable: custom_page, title: "Card small", columns: 2) visit custom_page.url @@ -189,8 +189,8 @@ describe "Cards", :admin do end scenario "Show label only if it is present" do - card_1 = create(:widget_card, page: custom_page, title: "Card one", label: "My label") - card_2 = create(:widget_card, page: custom_page, title: "Card two") + card_1 = create(:widget_card, cardable: custom_page, title: "Card one", label: "My label") + card_2 = create(:widget_card, cardable: custom_page, title: "Card two") visit custom_page.url @@ -204,7 +204,7 @@ describe "Cards", :admin do end scenario "Edit", :js do - create(:widget_card, page: custom_page, title: "Original title") + create(:widget_card, cardable: custom_page, title: "Original title") visit admin_site_customization_page_widget_cards_path(custom_page) @@ -227,7 +227,7 @@ describe "Cards", :admin do end scenario "Destroy", :js do - create(:widget_card, page: custom_page, title: "Card title") + create(:widget_card, cardable: custom_page, title: "Card title") visit admin_site_customization_page_widget_cards_path(custom_page) diff --git a/spec/system/site_customization/custom_pages_spec.rb b/spec/system/site_customization/custom_pages_spec.rb index a54c50b37..68a1745cf 100644 --- a/spec/system/site_customization/custom_pages_spec.rb +++ b/spec/system/site_customization/custom_pages_spec.rb @@ -104,7 +104,7 @@ describe "Custom Pages" do scenario "Show widget cards for that page" do custom_page = create(:site_customization_page, :published) - create(:widget_card, page: custom_page, title: "Card Highlights") + create(:widget_card, cardable: custom_page, title: "Card Highlights") visit custom_page.url