के साथ उलझ जाता है मैं मौजूदा रेल 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
.* FROMcontacts
INNER JOINcontacts_sites
ONcontacts
.id
=contacts_sites
.contact_id
INNER JOINsites
ONcontacts_sites
.site_id
=sites
.id
WHEREsites
.client_id
= 5 ANDsites
.deleted
= 0 ORDER BYcontacts
.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) }
का उपयोग करने का प्रयास किया, लेकिन मूल रूप से रिपोर्ट की गई वही त्रुटि मिली।
ओपी नहीं, लेकिन मुझे लगता है कि ऑर्डर साइट टेबल का जिक्र कर रहा था, जिसमें नाम कॉलम होगा (लेकिन अंतिम नाम कॉलम नहीं)। –
पवित्र गाय, आप सही हैं। मैंने उस '.order() 'को लिया, और क्वेरी काम किया। लेकिन, इरादे को सॉर्ट करना था, संपर्कों पर नहीं।, जैसा कि एरिक ने सही ढंग से मूल्यांकन किया था। एक परीक्षण के रूप में, मैंने इसे बदल दिया '।ऑर्डर ('sites.name' =>: asc) 'और एक नया अपवाद फेंक दिया गया था,' sites.sites.name 'के बारे में शिकायत नहीं है। तो, किसी भी तरह से, '.order() 'यहां टूटा हुआ है। –
अजीब, आप सही @EricPalace हैं, मैंने * दिल से * माना कि यह 'क्लाइंट' का जिक्र कर रहा था। पिछली बार मुझे इसी तरह की सूची का ऑर्डर देना पड़ा था, इस कारण से मैं 'शर्तों => ["join_table.some_column ...' का उपयोग कर समाप्त हुआ –