Skip to content

Addressbook: Add foreign key, dependent/inverse_of options #6265

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 24 additions & 6 deletions core/app/models/concerns/spree/user_address_book.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module UserAddressBook
extend ActiveSupport::Concern

included do
has_many :user_addresses, foreign_key: "user_id", class_name: "Spree::UserAddress" do
has_many :user_addresses, foreign_key: "user_id", class_name: "Spree::UserAddress", inverse_of: :user, dependent: :destroy do
def find_first_by_address_values(address_attrs)
detect { |ua| ua.address == Spree::Address.new(address_attrs) }
end
Expand All @@ -32,11 +32,29 @@ def mark_default(user_address, address_type: :shipping)

has_many :addresses, through: :user_addresses

has_one :default_user_bill_address, ->{ default_billing }, class_name: 'Spree::UserAddress', foreign_key: 'user_id'
has_one :bill_address, through: :default_user_bill_address, source: :address

has_one :default_user_ship_address, ->{ default_shipping }, class_name: 'Spree::UserAddress', foreign_key: 'user_id'
has_one :ship_address, through: :default_user_ship_address, source: :address
has_one :default_user_bill_address,
->{ default_billing },
class_name: 'Spree::UserAddress',
foreign_key: 'user_id',
inverse_of: false,
dependent: false
has_one :bill_address,
through: :default_user_bill_address,
source: :address,
inverse_of: false,
dependent: false

has_one :default_user_ship_address,
->{ default_shipping },
class_name: 'Spree::UserAddress',
foreign_key: 'user_id',
inverse_of: false,
dependent: false
has_one :ship_address,
through: :default_user_ship_address,
source: :address,
inverse_of: false,
dependent: false

accepts_nested_attributes_for :ship_address
accepts_nested_attributes_for :bill_address
Expand Down
4 changes: 2 additions & 2 deletions core/app/models/spree/user_address.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

module Spree
class UserAddress < Spree::Base
belongs_to :user, class_name: UserClassHandle.new, foreign_key: "user_id", optional: true
belongs_to :address, class_name: "Spree::Address", optional: true
belongs_to :user, class_name: UserClassHandle.new, foreign_key: "user_id", inverse_of: :user_addresses
belongs_to :address, class_name: "Spree::Address"

validates_uniqueness_of :address_id, scope: :user_id
validates_uniqueness_of :user_id, conditions: -> { default_shipping }, message: :default_address_exists, if: :default?
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

class AddAddressbookForeignKey < ActiveRecord::Migration[7.0]
def change
add_foreign_key :spree_user_addresses, :spree_addresses, column: :address_id, null: false
end
end