2012-07-26 20 views
6

में डिफ़ॉल्ट_स्कोप ActiveRecord में एक डिफ़ॉल्ट स्कोप निर्दिष्ट करने के लिए default_scope क्लास विधि है। उदाहरण के लिएसेक्वेल

class User < ActiveRecord::Base 
    default_scope where(:deleted => false) 
end 

User.all # => SELECT * FROM users WHERE deleted = 0; 

मैं इसे Sequel::Model में कैसे कर सकता हूं?

संपादित करें:

कुछ Googling के बाद मैं अंत में कुछ उपयोगी जानकारी नहीं मिली।

class User < Sequel::Model 

    # Define some "scopes" (filters on the dataset) 
    dataset_module do 
    def existing 
     filter(deleted: false) 
    end 

    def active 
     filter(disabled: false) 
    end 
    end 

    # This is the equivalent to a default_scope. Set one of the datasets 
    # as the default dataset for this model. 
    set_dataset(self.active) 
end 

उत्पन्न क्वेरी तो इस तरह दिखता है:

User.all # => SELECT * FROM `users` WHERE (`deleted` IS FALSE) 

रास्ता द्वारा: unscoped के बराबर unfiltered है:

User.unfiltered.all # => SELECT * FROM `users` 

लेकिन, वहाँ एक समस्या है । यदि आप किसी ऐसे उपयोगकर्ता को अपडेट करने का प्रयास करते हैं जो आपको एक unfiltered डेटासेट से मिला है, तो यह दिए गए डेटासेट का उपयोग कर उपयोगकर्ता को अपडेट करने का प्रयास करता है।

User.create(disabled: true, deleted: true) 
User.all # => [] 
u = User.unfiltered.first # => Given user 
u.disabled = false 
u.save # => UPDATE users SET ... WHERE (disabled IS FALSE AND id = 1) 
# => Sequel::NoExistingObject: Attempt to update object did not result in a single row modification 

तो मैं शुरुआत में वापस आ गया हूं। इसके लिए कोई कामकाज?

उत्तर

5

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

आप इसे सबक्लासिंग द्वारा भी संभाल सकते हैं (उपयोगकर्ता स्कॉप्ड नहीं है, ActiveUser < उपयोगकर्ता स्कॉप्ड है)। हालांकि, मुझे लगता है कि स्पष्ट स्कोपिंग दृष्टिकोण बेहतर काम करता है।

सभी ही कहा जा रहा है, तो आप वास्तव में एक डिफ़ॉल्ट गुंजाइश उपयोग करना चाहते हैं, निम्नलिखित मॉडल के डिफ़ॉल्ट दायरे से बाहर एक मॉडल उदाहरण को अद्यतन करने की समस्या के समाधान हो सकता है:

User.instance_dataset.unfiltered!