ruby on rails - एक खाली ActiveRecord संबंध कैसे वापस करें?




ruby-on-rails relation (6)

यदि मेरे पास लैम्ब्डा के साथ एक गुंजाइश है और तर्क के मूल्य के आधार पर यह तर्क लेता है, तो मुझे पता चलेगा कि कोई भी मैच नहीं होगा, लेकिन मैं अभी भी एक रिलेशन को वापस करना चाहता हूं, खाली सरणी नहीं:

scope :for_users, lambda { |users| users.any? ? where("user_id IN (?)", users.map(&:id).join(',')) : [] }

जो मैं वास्तव में चाहता हूं वह "कोई नहीं" विधि है, "सभी" के विपरीत, जो एक रिश्ते को वापस लाता है जिसे अभी भी जंजीर बनाया जा सकता है, लेकिन परिणामस्वरूप शॉर्ट सर्किट होता है।


रेल 4 में आ रहा है

रेल 4 में, एक श्रृंखला योग्य ActiveRecord::NullRelation जैसी कॉल से वापस कर दिया जाएगा।

न तो यह, न ही जंजीर विधियों, डेटाबेस के लिए क्वेरी उत्पन्न करेगा।

टिप्पणियों के मुताबिक:

लौटा ActiveRecord :: NullRelation संबंध से विरासत में मिलता है और शून्य ऑब्जेक्ट पैटर्न लागू करता है। यह परिभाषित शून्य व्यवहार वाला एक ऑब्जेक्ट है और डेटाबेस को घुमाने के बिना हमेशा रिकॉर्ड्स की रिक्त सरणी देता है।

स्रोत कोड देखें।


आप "none" नामक एक दायरा जोड़ सकते हैं:

scope :none, where(:id => nil).where("id IS NOT ?", nil)

इससे आपको एक खाली ActiveRecord :: संबंध मिलेगा

आप इसे प्रारंभिक में ActiveRecord :: बेस में भी जोड़ सकते हैं (यदि आप चाहते हैं):

class ActiveRecord::Base
 def self.none
   where(arel_table[:id].eq(nil).and(arel_table[:id].not_eq(nil)))
 end
end

इस तरह कुछ पाने के कई तरीके हैं, लेकिन कोड आधार में रखने के लिए निश्चित रूप से सबसे अच्छी बात नहीं है। मैंने दायरा का उपयोग किया है: कोई भी जब रिफैक्टरिंग और खोज नहीं करता है तो मुझे एक खाली ActiveRecord :: कम समय के लिए संबंध की गारंटी देने की आवश्यकता है।


मुझे लगता है कि मैं अन्य विकल्पों को देखने के तरीके को पसंद करता हूं:

scope :none, limit(0)

इस तरह कुछ करने के लिए अग्रणी:

scope :users, lambda { |ids| ids.present? ? where("user_id IN (?)", ids) : limit(0) }

यह संभव है और इसलिए यह है:

scope :for_users, lambda { |users| users.any? ? where("user_id IN (?)", users.map(&:id).join(',')) : User.none }

http://apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/none

यदि मैं गलत हूं तो मुझे सही करों।


वेरिएंट भी हैं, लेकिन ये सभी डीबी के लिए अनुरोध कर रहे हैं

where('false')
where('null')

स्कॉप्ड का प्रयोग करें:

scope :for_users, lambda { |users| users.any? ? where("user_id IN (?)", users.map(&:id).join(',')) : scoped }

लेकिन, आप अपने कोड को इसके साथ सरल बना सकते हैं:

scope :for_users, lambda { |users| where(:user_id => users.map(&:id)) if users.any? }

यदि आप एक खाली परिणाम चाहते हैं, तो इसका उपयोग करें (अगर स्थिति को हटा दें):

scope :for_users, lambda { |users| where(:user_id => users.map(&:id)) }




relation