--Chỉnh sửa--Kết quả đặt hàng đường ray với nhiều lần tham gia vào cùng một bảng
Tôi muốn đơn giản hóa câu hỏi này. Với cấu trúc mô hình này:
has_one :pickup_job, class_name: 'Job', source: :job
has_one :dropoff_job, class_name: 'Job', source: :job
Những gì tôi muốn làm là:
Package.joins(:dropoff_job, :pickup_job).order(pickup_job: {name: :desc})
này rõ ràng là không hợp lệ, cú pháp thực tế nên được sử dụng là:
.order('jobs.name desc')
Tuy nhiên cách mà đường ray tham gia các bảng có nghĩa là tôi không thể đảm bảo tên bí danh sẽ là gì (nếu có), và lệnh này sẽ được đặt theo dropoff_job.name
thay vì pickup_job.name
irb(main):005:0> Package.joins(:dropoff_job, :pickup_job).order('jobs.name desc').to_sql
=> "SELECT \"packages\".* FROM \"packages\" INNER JOIN \"jobs\" ON \"jobs\".\"id\" = \"packages\".\"dropoff_job_id\" INNER JOIN \"jobs\" \"pickup_jobs_packages\" ON \"pickup_jobs_packages\".\"id\" = \"packages\".\"pickup_job_id\" ORDER BY jobs.name desc"
Ngoài ra tôi không kiểm soát cách các bảng được nối, vì vậy tôi không thể xác định bí danh bảng.
--UPDATE--
Tôi đã có một vở kịch với cố gắng để trích xuất các tên bí danh từ phạm vi hiện tại sử dụng một cái gì đó như thế này:
current_scope.join_sources.select { |j| j.left.table_name == 'locations' }
Nhưng vẫn còn một chút khó khăn và thực sự cảm thấy như có một giải pháp MUCH đơn giản hơn. câu trả lời
--UPDATE--
chảo của làm việc trong một số kịch bản nhưng tôi đang tìm kiếm một giải pháp đó là năng động hơn một chút.
Vấn đề là tôi không tự mình tham gia. Tôi đang sử dụng một viên ngọc gọi là filterrific. Tôi nghĩ rằng phải có một cách để có được tên bí danh từ 'current_scope'? – Rick
Tôi đã trao cho bạn tiền thưởng vì câu trả lời của bạn gần gũi hơn với những gì tôi đang theo nhưng nó không phải là giải pháp lý tưởng mà tôi đang tìm kiếm. – Rick