2013-06-28 6 views
6

के साथ उलझ जाता है मैं मौजूदा रेल 3.2 आवेदन को 4.0 पर अपग्रेड करने पर काम कर रहा हूं। हालांकि, मैंने एक ईंट की दीवार में भाग लिया है।रेल 4। ऑर्डर() जॉइन

मेरे पास तीन मॉडल, ग्राहक, साइट और संपर्क हैं। साइटें भौतिक स्थान हैं जो क्लाइंट से संबंधित हैं, और ग्राहक के पास कई साइटें हो सकती हैं। संपर्क वे लोग हैं जो एक या अधिक साइटों से संबंधित हैं। इस प्रकार, एक ग्राहक साइट के माध्यम से कई संपर्क हो सकता है।

ग्राहक:

class Client < ActiveRecord::Base 

    has_many :sites, -> { where(:sites => {:deleted => false}).order(:name => :asc) }, :dependent => :destroy 
    has_many :contacts, -> { order(:lastname => :asc) }, :through => :sites 

end 

साइटें:

class Site < ActiveRecord::Base 

    belongs_to :client 
    has_and_belongs_to_many :contacts 

end 

संपर्क:

class Contact < ActiveRecord::Base 

    has_and_belongs_to_many :sites 

end 

समस्या यह है कि जब मैं यू

Mysql2::Error: Unknown column 'contacts.name' in 'order clause': SELECT contacts .* FROM contacts INNER JOIN contacts_sites ON contacts . id = contacts_sites . contact_id INNER JOIN sites ON contacts_sites . site_id = sites . id WHERE sites . client_id = 5 AND sites . deleted = 0 ORDER BY contacts . lastname ASC, contacts . name ASC

वहाँ समस्या है: se Client.find(1).contacts, मैं एक ActiveRecord::StatementInvalid अपवाद मुझे नहीं पता कि जहां ORDER BY ... `contacts`.`name` ASC से आ रहा है। संपर्क तालिका में नाम कॉलम नहीं है, लेकिन रेल इसके साथ सॉर्ट करने का प्रयास कर रहा है और मुझे नहीं पता कि यह कहां से आ रहा है या इसे कैसे निकाला जा सकता है। ORDER BY `contacts`.`lastname` ASC आसान है; यह ग्राहक मॉडल से आता है।

इन रिश्तों ने 3.2 में बेकार ढंग से काम किया है, लेकिन अब इस अपवाद को 4.0 में फेंक दें।

अद्यतन: यह बताया गया है कि अतिरिक्त ORDER BY ... `contacts`.`name` ASC पहले has_many ग्राहकों मॉडल में से आ रही है। हालांकि, साइट्स को सॉर्ट करने का इरादा, संपर्कों पर नहीं था। मैंने इसे .order('sites.name' => :asc) में बदलने की कोशिश की और एसक्यूएल ने शिकायत की कि sites.sites.name नामक कोई कॉलम नहीं है। इसलिए, ऐसा लगता है कि :through => का उपयोग has_many के साथ करते समय, ऑर्डर क्लॉज उलझ जाता है।

मैंने साइट्स मॉडल में .order() को हटाने और default_scope -> { order(:name => :asc) } का उपयोग करने का प्रयास किया, लेकिन मूल रूप से रिपोर्ट की गई वही त्रुटि मिली।

उत्तर

9

समाधान सरल है। .order(:column_name => :asc) का उपयोग करने के बजाय, मैंने इसे .order('column_name ASC') में बदल दिया और त्रुटि समाप्त हो गई, अपेक्षित परिणाम प्रदान किया। मैं मूल रूप से उत्तरार्द्ध था, लेकिन मेरे रेल 3 -> 4 अपग्रेड के हिस्से के रूप में पूर्व को लागू कर रहा था, और रेलस्कास्ट और अन्य दस्तावेज में इस तरह के सम्मेलन को देखा।

.joins() का उपयोग करते समय यह भी आवश्यक है और बाद में तालिका कॉलम में ऑर्डर करके यह आवश्यक है। यह समझ में आता है, क्योंकि एसोसिएशन भी जुड़ता है।

1

आप थक गए होंगे अपने दूसरी पंक्ति (Client मॉडल), आपके पास order(:name=> :asc) में वहीं,, यह होना चाहिए:

class Client < ActiveRecord::Base 

    has_many :sites, -> { where(:sites => {:deleted => false}).order(:lastname => :asc) }, :dependent => :destroy 
    has_many :contacts, -> { order(:lastname => :asc) }, :through => :sites 

end 
+0

ओपी नहीं, लेकिन मुझे लगता है कि ऑर्डर साइट टेबल का जिक्र कर रहा था, जिसमें नाम कॉलम होगा (लेकिन अंतिम नाम कॉलम नहीं)। –

+0

पवित्र गाय, आप सही हैं। मैंने उस '.order() 'को लिया, और क्वेरी काम किया। लेकिन, इरादे को सॉर्ट करना था, संपर्कों पर नहीं।, जैसा कि एरिक ने सही ढंग से मूल्यांकन किया था। एक परीक्षण के रूप में, मैंने इसे बदल दिया '।ऑर्डर ('sites.name' =>: asc) 'और एक नया अपवाद फेंक दिया गया था,' sites.sites.name 'के बारे में शिकायत नहीं है। तो, किसी भी तरह से, '.order() 'यहां टूटा हुआ है। –

+0

अजीब, आप सही @EricPalace हैं, मैंने * दिल से * माना कि यह 'क्लाइंट' का जिक्र कर रहा था। पिछली बार मुझे इसी तरह की सूची का ऑर्डर देना पड़ा था, इस कारण से मैं 'शर्तों => ["join_table.some_column ...' का उपयोग कर समाप्त हुआ –