2017-02-18 15 views
9

--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.

Trả lời

0

Bạn có thể thử một cái gì đó giống như

Package.joins("INNER JOIN locations as dropoff_location ON dropoff_location.id = packages.dropoff_location_id INNER JOIN locations as pickup_location ON pickup_location.id = packages.pickup_location_id) 

Idea này là tạo bí danh của riêng bạn khi tham gia bảng

+0

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

+0

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

5

Sử dụng nối của tên hiệp hội trong số nhiềutên bảng hiện như một tên bí danh của bảng theo phương thức để:

Package.joins(:dropoff_job, :pickup_job).order('pickup_jobs_packages.name desc') 
+1

Tôi hiểu cách đường ray tạo bí danh, nhưng giả sử rằng phần thứ tự được thiết lập dưới dạng phạm vi và tôi không biết thứ tự các bảng đã được nối với nhau. Tôi có thể sử dụng văn bản tĩnh đó '' pickup_jobs_packages.name desc'' nhưng điều đó sẽ thất bại nếu pickup_job được tham gia trước. Tôi có thể thay đổi văn bản đơn đặt hàng thành ''jobs.name desc'', nhưng điều này sẽ luôn đặt trên lần tham gia đầu tiên. – Rick

Các vấn đề liên quan