2017-02-18 4 views
9

- एडिट -रेल के ऑर्डर परिणाम एक ही तालिका में एकाधिक जुड़ने के साथ

मैं इस प्रश्न को सरल बनाना चाहता था। इस मॉडल संरचना के साथ:

has_one :pickup_job, class_name: 'Job', source: :job 
has_one :dropoff_job, class_name: 'Job', source: :job 

मुझे क्या करना चाहते हैं: मान्य नहीं जाहिर

Package.joins(:dropoff_job, :pickup_job).order(pickup_job: {name: :desc}) 

यह है, वास्तविक वाक्य रचना कि इस्तेमाल किया जाना चाहिए है:

.order('jobs.name desc') 

हालांकि जिस तरह से रेल टेबल में शामिल हो जाते हैं, इसका मतलब है कि मैं यह सुनिश्चित नहीं कर सकता कि तालिका उपनाम का नाम क्या होगा (यदि कुछ भी हो), और यहके बजाय dropoff_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" 

इसके अलावा, मैं कैसे टेबल शामिल हो गए हैं के नियंत्रण में नहीं कर रहा हूँ, तो मैं मेज उर्फ ​​परिभाषित नहीं कर सकते हैं।

--UPDATE--

मैं कुछ इस तरह का उपयोग कर वर्तमान क्षेत्र से अन्य नाम नाम निकालने के लिए कोशिश कर रहा है के साथ एक खेल पड़ा है:

current_scope.join_sources.select { |j| j.left.table_name == 'locations' } 

लेकिन फिर भी एक छोटे से अटक कर रहा हूँ और वास्तव में महसूस हो रहा है जैसे कि एक बहुत आसान समाधान होना चाहिए।

--UPDATE--

पैन का जवाब कुछ परिस्थितियों में काम करता है, लेकिन मैं एक समाधान है कि थोड़ा अधिक गतिशील रहा हूँ।

उत्तर

0

आप इस

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) 

आइडिया की तरह कुछ कोशिश कर सकते हैं तालिका

+0

इसके साथ समस्या यह है कि मैं खुद को शामिल नहीं कर रहा हूं। मैं फिल्टररफिश नामक एक मणि का उपयोग कर रहा हूं। मुझे लगता है कि 'current_scope' से उपनाम नाम प्राप्त करने का कोई तरीका होना चाहिए? – Rick

+0

मैंने आपको बक्षीस दिया है क्योंकि आपका उत्तर मेरे बाद के करीब है लेकिन यह किसी भी तरह का आदर्श समाधान नहीं है जिसे मैं ढूंढ रहा था। – Rick

5

उपयोग एक के रूप में बहुवचन और वर्तमान तालिका नाम में संघ नाम का संयोजन में शामिल होते समय अपने स्वयं के अन्य नाम बनाना है क्रम में तालिका उपनाम का नाम विधि:

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

मैं समझता हूं कि रेल कैसे उपनाम उत्पन्न करते हैं, लेकिन मान लें कि ऑर्डर भाग एक दायरे के रूप में स्थापित है और मुझे नहीं पता कि तालिका किस क्रम में शामिल हो गई है। मैं उस स्थिर पाठ 'pickup_jobs_packages.name desc'' का उपयोग कर सकता हूं लेकिन अगर pickup_job पहले शामिल हो गया तो यह असफल हो जाएगा। मैं ऑर्डर टेक्स्ट को'jobs.name desc'' 'में बदल सकता हूं, लेकिन यह हमेशा पहले शामिल होने पर ऑर्डर करेगा। – Rick

संबंधित मुद्दे