2011-06-13 14 views
12

मेरे पास उपयोगकर्ता पर एक क्लास विधि है, जो रिटर्न उपयोगकर्ता के लिए एक जटिल चयन/जॉइन/ऑर्डर/सीमा लागू करता है, और संबंध देता है। यह where(:admin => true) खंड भी लागू करता है। यदि मेरे पास उस संबंध वस्तु है तो क्या यह एक विशेष where कथन को निकालना संभव है?किसी ActiveRecord :: '0' से एक 'कहां' खंड निकालें :: रिलेशन

User.complex_stuff.without_where(:admin => true) 

उत्तर

6

आप कुछ इस तरह कर सकता है (where_values प्रत्येक where क्वेरी रखती है; आप एसक्यूएल आपके सिस्टम पर :admin => true की सटीक उत्पादन मैच के लिए tweak करना होगा)। दृढ़ता से

@users = User.complex_stuff 
@users.where_values.delete_if { |query| query.to_sql == "\"users\".\"admin\" = 't'" } 

हालांकि, मैं चाहता हूँ: ध्यान रखें कि यह केवल यदि आप वास्तव में अभी तक क्वेरी निष्पादित नहीं किया है काम करेंगे (यानी आप उस पर .all कहा जाता है नहीं है, या एक दृश्य में इसके परिणाम प्रयुक्त) इसके बजाय complex_stuff विधि को पुनर्गठन के एमिली के उत्तर का उपयोग करने की अनुशंसा करें।

10

तरह मैं यह करने के लिए एक रास्ता नहीं मिला है। सबसे अच्छा समाधान शायद आपके मौजूदा complex_stuff विधि को पुन: स्थापित करना है।

सबसे पहले, complex_stuff_without_admin एक नई विधि बनाएं जो where(:admin => true) जोड़ने के अलावा सबकुछ करता है complex_stuff करता है। फिर User.complex_stuff_without_admin.where(:admin => true) पर कॉल करने के लिए complex_stuff विधि को फिर से लिखें।

असल में, बस विपरीत पक्ष से संपर्क करें। जहां आवश्यक हो वहां ले जाने के बजाय, जहां आवश्यक हो वहां जोड़ें।

20

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन चूंकि रेल 4 अब आप इस

User.complex_stuff.unscope(where: :admin) 

क्या कर सकते हैं इस प्रश्न का जहां व्यवस्थापक हिस्सा निकाल देंगे, अगर आप unconditinoally पूरे where हिस्सा unscope को

चाहते
User.complex_stuff.unscope(:where) 

पुनश्च: धन्यवाद मेरी गलती ओर इशारा करते हुए के लिए @Samuel को

+0

unscope विधि इस तरह काम नहीं करता:

मेरे लिए, यह शामिल हो गए दायरे में चला गया है, तो जैसे (किसी भी अधिक?): 'User.complex_stuff। अनसुलझा (जहां:: व्यवस्थापक) '(देखें http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-unscope) – Samuel

+0

मुझे लगता है कि आपका क्या मतलब है, मैं आज रात दोबारा जांच करूंगा और अपना अपडेट करूंगा जवाब। –

0

मैं इस (Remove a 'where' clause from an ActiveRecord::Relation जो द्वारा बनाई जा रही थी क्या करने की जरूरत है एक गुंजाइश) दो स्कॉप्स में शामिल होने के दौरान, और इसे इस तरह किया: self.scope(from,to).values[:joins]

मैं उन दो क्षेत्रों से मूल्यों में शामिल होना चाहता था, जो 'जहां' क्लॉज के बिना 'join_scope' बनाते थे, ताकि मैं अलग-अलग 'कहां' खंडों को अलग-अलग जोड़ सकूं ('AND' के बजाय 'OR' का उपयोग करने के लिए बदल गया)। आशा

scope :joined_scope, -> (from, to) { 
    joins(self.first_scope(from,to).values[:joins]) 
    .joins(self.other_scope(from,to).values[:joins]) 
    .where(first_scope(from,to).ast.cores.last.wheres.inject{|ws, w| (ws &&= ws.and(w)) || w} 
    .or(other_scope(from,to).ast.cores.last.wheres.last)) 
} 

में मदद करता है कि किसी को

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