fix: Resolve account switching issue for users with new accounts

## Summary
  - Fix account switching bug where new users couldn't switch accounts properly
  - Update `active_account_user` method to handle NULL `active_at` values correctly using `NULLS LAST` sorting
  - Add comprehensive specs to test the NULL handling behavior

  ## Problem
  When users were added to new accounts, the `active_at` field was NULL. The existing `ORDER BY active_at DESC` had undefined behavior for NULL values, causing:
  - Mobile apps to receive wrong `account_id` from `/profile` API
  - Account switching to fail until multiple attempts "fixed" it temporarily
  - Issue recurring whenever new accounts were added

  ## Solution
  - Updated `active_account_user` method in `UserAttributeHelpers` to use `NULLS LAST` sorting
  - This ensures accounts with actual timestamps are prioritized over NULL values
  - Added specs covering normal sorting, NULL handling, and edge cases
This commit is contained in:
Muhsin
2025-08-29 19:38:52 +05:30
parent 99997a701a
commit 28969deb01
2 changed files with 42 additions and 1 deletions
@@ -18,7 +18,7 @@ module UserAttributeHelpers
end
def active_account_user
account_users.order(active_at: :desc)&.first
account_users.order(Arel.sql('active_at DESC NULLS LAST'))&.first
end
def current_account_user
+41
View File
@@ -110,4 +110,45 @@ RSpec.describe User do
expect(new_user.email).to eq('test123@test.com')
end
end
describe '#active_account_user' do
let(:user) { create(:user) }
let(:account1) { create(:account) }
let(:account2) { create(:account) }
let(:account3) { create(:account) }
before do
# Create account_users with different active_at values
create(:account_user, user: user, account: account1, active_at: 2.days.ago)
create(:account_user, user: user, account: account2, active_at: 1.day.ago)
create(:account_user, user: user, account: account3, active_at: nil) # New account with NULL active_at
end
it 'returns the account_user with the most recent active_at when all have timestamps' do
expect(user.active_account_user.account_id).to eq(account2.id)
end
it 'prioritizes accounts with active_at over NULL values (NULLS LAST behavior)' do
# Even though account3 was created last, it should not be returned due to NULL active_at
expect(user.active_account_user.account_id).to eq(account2.id)
end
it 'returns NULL active_at account only when no other accounts have active_at' do
# Remove active_at from all accounts
user.account_users.update_all(active_at: nil)
# Should return one of the accounts (behavior is undefined but consistent)
expect(user.active_account_user).to be_present
end
context 'when multiple accounts have NULL active_at' do
before do
create(:account_user, user: user, account: create(:account), active_at: nil)
end
it 'still prioritizes accounts with timestamps' do
expect(user.active_account_user.account_id).to eq(account2.id)
end
end
end
end