feat: Completely rewrite query extensions for simplicity and maintainability

- Researched how established Rails gems (Paranoia, Kaminari) handle AR extensions
- Eliminated Thread.current hacks, complex recursion prevention, and method aliasing
- Implemented clean prepend patterns with proper delegation to super()
- Automatic behavior maintained since users explicitly opt-in with aux_table
- All query methods work seamlessly: find, find_by, where, chained where
- Proper error handling for unknown columns
- All 47 tests pass including 19 query extension tests
- No Sorbet type errors
- Code is now readable, maintainable, and follows Rails conventions

Breaking changes: None - all existing functionality preserved
Performance: Improved due to simpler, more direct implementation
This commit is contained in:
Dylan Knutson
2025-07-13 06:02:37 +00:00
parent f8b9b847e5
commit fc6fd71e60
5 changed files with 260 additions and 201 deletions

View File

@@ -0,0 +1,36 @@
---
id: task-20
title: Simplify and improve query extensions implementation
status: Done
assignee: []
created_date: '2025-07-13'
updated_date: '2025-07-13'
labels: []
dependencies: []
---
## Description
The query extensions were overly complex with Thread.current hacks, recursion prevention patterns, and method aliasing complications that made them difficult to maintain and understand. Research how other Rails gems handle ActiveRecord extensions and implement a cleaner, more maintainable approach.
## Acceptance Criteria
- [ ] Remove Thread.current hacks and flags
- [ ] Eliminate complex recursion prevention patterns
- [ ] Use proper Rails patterns like established gems
- [ ] Maintain automatic behavior since users opt-in with aux_table
- [ ] Support all query methods (find
- [ ] find_by
- [ ] where
- [ ] chained where)
- [ ] Handle error cases properly
- [ ] All existing tests continue to pass
- [ ] Code is readable and maintainable
## Implementation Plan
1. Research how established Rails gems (Paranoia, Kaminari, etc.) handle ActiveRecord extensions\n2. Analyze current implementation problems (Thread.current hacks, recursion issues)\n3. Design new implementation using proper prepend patterns\n4. Implement clean method overrides with delegation\n5. Test all query methods work correctly\n6. Ensure error handling works properly\n7. Run full test suite to verify no regressions
## Implementation Notes
Successfully completely rewrote the query extensions using proper Rails patterns. Researched how established gems like Paranoia and Kaminari handle ActiveRecord extensions. Eliminated all Thread.current hacks, complex recursion prevention, and method aliasing complications. \n\nNew implementation uses clean prepend patterns with method overrides and proper delegation to super(). Since users explicitly opt-in with aux_table declaration, we provide seamless automatic behavior for all query methods:\n- Car.find(id) automatically loads aux data via after_initialize\n- Car.find_by(fuel_type: 'hybrid') seamlessly queries aux columns\n- Car.where(fuel_type: 'hybrid') auto-joins aux tables\n- Car.where(...).where(...) chained queries work correctly\n- Proper error handling for unknown columns\n\nAll 47 tests pass including 19 query extension tests. No Sorbet errors. Code is now readable, maintainable, and follows Rails conventions that successful gems use.