64

मैं जानता हूँ कि where ActiveRecord विधि करने के लिए तर्क की आपूर्ति के लिए 3 मुख्य अंकन देखते हैं:ActiveRecord OR क्वेरी हैश अंकन

  1. शुद्ध स्ट्रिंग
  2. सरणी
  3. हैश

के लिए and निर्दिष्ट करना where विधि सीधे आगे है:

# Pure String notation 
Person.where("name = 'Neil' AND age = 27") 

# Array notation 
Person.where(["name = ? AND age = ?", 'Neil', 27]) 

# Hash notation 
Person.where({name: "Neil", age: 27}) 

or निर्दिष्ट करने के लिए where विधि हैश सिंटैक्स के लिए मुझे स्टंप कर रहा है। क्या यह संभव है?

# Pure String notation 
Person.where("name = 'Neil' OR age = 27") 

# Array notation 
Person.where(["name = ? OR age = ?", 'Neil', 27]) 

# Hash notation DOESN'T WORK 
Person.where({name: "Neil" OR age: 27}) 

उत्तर

126

5 विकल्पों «हैश अंकन» के कार्यान्वयन के रूप में माना जा सकता है (पिछले दो थोड़े hash- हैं ish):

  1. रूबी के साथ

    ऑन रेल्स 5 आप में सक्षम हैं एक साथ

    Person.where(name: 'Neil').or(Person.where(age: 27)) 
    
  2. उपयोग where_values ०१२३६१५६३७ साथ: ActiveRecord::Relation#or पद्धति का उपयोग करके निम्नलिखित श्रृंखलन करने के लिए। unscoped विधि only for Rails 4.1+ आवश्यक है default_scopewhere_values में शामिल नहीं है।अन्यथा दोनों default_scope से predicates और whereor ऑपरेटर के साथ श्रृंखलित किया जाएगा:

    • Where Or(के backport:

      Person.where( 
          Person.unscoped.where(name: ['Neil'], age: [27]).where_values.reduce(:or) 
      ) 
      
    • प्लग-इन है कि इन या इसी तरह की सुविधाओं को लागू, उदाहरण के लिए स्थापित करें रेल पर रूबी 5 .or ऊपर वर्णित सुविधा)

    • Squeel

      Person.where{(name == 'Neil') | (age == 27)} 
      
    • RailsOr

      Person.where(name: 'Neil').or(age: 27) 
      
    • ActiverecordAnyOf

      Person.where.anyof(name: 'Neil', age: 27) 
      
    • SmartTuple

      Person.where(
          (SmartTuple.new(' or ') << {name: 'Neil', age: 27}).compile 
      ) 
      
  3. उपयोग Arel:

    Person.where( 
        Person.arel_table[:name].eq('Neil').or(
        Person.arel_table[:age].eq(27) 
    ) 
    ) 
    
  4. उपयोग नामित मानकों के साथ विवरण तैयार:

    Person.where('name = :name or age = :age', name: 'Neil', age: 27) 
    
+1

यह एक पूर्ण जवाब है। 'एलएल' उत्तर विशेष रूप से अच्छा है क्योंकि यह समझता है कि रेल 5 में जो जोड़ा जा रहा है, जैसा कि मैं समझता हूं। –

+0

यदि आप रेल 5 की प्रतीक्षा नहीं कर सकते हैं, तो आप फीचर 4.2 के इस सुविधा का बैकपोर्ट उपयोग कर सकते हैं। 'जहां-या' मणि के रूप में अच्छी तरह से पैक किया गया है https://github.com/Eric-Guo/where-or – Rob

+0

यदि आपकी परियोजना अभी भी रेल 3+ में है, तो आप rails_or मणि को आजमा सकते हैं: https: // github। com/khiav223577/rails_or –

1

के रूप में कहते हैं potashin, तो आप एक प्लग-इन है कि इस सुविधा को लागू उपयोग कर सकते हैं । मेरे पास Squeel का उपयोग करने में काफी समय है और इसके लिए बहुत अच्छी तरह से काम करता है और जटिल सबक्वायरी या जुड़ने जैसी कई सुविधाएं।

कि squeel का उपयोग कर क्वेरी:

@people= Person.where{(name == 'Neil') | (age = 27)} 
संबंधित मुद्दे