diff --git a/core/app/models/spree/zone.rb b/core/app/models/spree/zone.rb index 31e41e217d5..36251871ddb 100644 --- a/core/app/models/spree/zone.rb +++ b/core/app/models/spree/zone.rb @@ -3,6 +3,11 @@ class Zone < Spree::Base has_many :zone_members, dependent: :destroy, class_name: "Spree::ZoneMember", inverse_of: :zone has_many :tax_rates, dependent: :destroy, inverse_of: :zone + with_options through: :zone_members, source: :zoneable do + has_many :countries, source_type: "Spree::Country" + has_many :states, source_type: "Spree::State" + end + has_many :shipping_method_zones has_many :shipping_methods, through: :shipping_method_zones diff --git a/core/lib/spree/testing_support/factories/zone_factory.rb b/core/lib/spree/testing_support/factories/zone_factory.rb index db3c3e583dd..6b06f283d7e 100644 --- a/core/lib/spree/testing_support/factories/zone_factory.rb +++ b/core/lib/spree/testing_support/factories/zone_factory.rb @@ -13,5 +13,9 @@ factory :zone, class: Spree::Zone do name { generate(:random_string) } description { generate(:random_string) } + + trait :with_country do + countries { [create(:country)] } + end end end diff --git a/core/spec/models/spree/zone_spec.rb b/core/spec/models/spree/zone_spec.rb index f9a76afcc81..19f383684b0 100644 --- a/core/spec/models/spree/zone_spec.rb +++ b/core/spec/models/spree/zone_spec.rb @@ -302,4 +302,29 @@ end end end + + context "state and country associations" do + let!(:country) { create(:country) } + + context "has countries associated" do + let!(:zone) do + create(:zone, countries: [country]) + end + + it "can access associated countries" do + expect(zone.countries).to eq([country]) + end + end + + context "has states associated" do + let!(:state) { create(:state, country: country) } + let!(:zone) do + create(:zone, states: [state]) + end + + it "can access associated states" do + expect(zone.states).to eq([state]) + end + end + end end