जवाबों:
आइए मूल उदाहरण पर विचार करें:
class Post < ActiveRecord::Base
default_scope { where(published: true) }
end
डिफ़ॉल्ट बनाने की प्रेरणा published: true, यह सुनिश्चित करने के लिए हो सकती है कि अप्रकाशित (निजी) पोस्ट दिखाने के लिए आपको खोज करनी पड़े। अब तक सब ठीक है।
2.1.1 :001 > Post.all
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't'
वैसे यह बहुत ज्यादा है जो हम उम्मीद करते हैं। अब कोशिश करते हैं:
2.1.1 :004 > Post.new
=> #<Post id: nil, title: nil, published: true, created_at: nil, updated_at: nil>
और वहाँ हम डिफ़ॉल्ट समस्या के साथ पहली बड़ी समस्या है:
=> default_scope आपके मॉडल इनिशियलाइज़ेशन को प्रभावित करेगा
इस तरह के एक मॉडल के नए बनाए गए उदाहरण में, default_scopeपरिलक्षित होगा। इसलिए जब आप संयोग से अप्रकाशित पदों को सूचीबद्ध नहीं करना चाहते हैं, तो आप अब डिफ़ॉल्ट रूप से प्रकाशित कर रहे हैं।
एक अधिक विस्तृत उदाहरण पर विचार करें:
class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end
class User < ActiveRecord::Base
has_many :posts
end
आओ हम पहले उपयोगकर्ताओं को पोस्ट करें:
2.1.1 :001 > User.first.posts
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't' AND "posts"."user_id" = ? [["user_id", 1]]
यह अपेक्षित लगता है (उपयोगकर्ता_आईडी के बारे में भाग को देखने के लिए दाईं ओर स्क्रॉल करने के लिए सुनिश्चित करें)।
अब हम सभी पदों की सूची प्राप्त करना चाहते हैं - अप्रकाशित शामिल - उपयोगकर्ता के दृश्य में लॉग के लिए कहें। आपको एहसास होगा कि आपको 'ओवरराइट' या 'पूर्ववत' करना है default_scope। एक त्वरित गूगल के बाद, आप के बारे में पता चल जाएगा unscoped। देखें आगे क्या होता है:
2.1.1 :002 > User.first.posts.unscoped
Post Load (0.2ms) SELECT "posts".* FROM "posts"
=> अनकैप्ड सभी स्कोप को हटाता है जो सामान्य रूप से आपके चयन पर लागू हो सकते हैं, जिसमें (लेकिन सीमित नहीं) संघ भी शामिल हैं।
के विभिन्न प्रभावों को अधिलेखित करने के कई तरीके हैं default_scope। उस अधिकार को प्राप्त करना बहुत जल्दी जटिल हो जाता है और मैं तर्क करता हूं default_scopeकि पहली जगह का उपयोग नहीं करना, एक सुरक्षित विकल्प होगा।
unscopedबजाय समस्या के साथ हैdefault_scope
default_scopeजब आप कुछ छांटना चाहते हैं तो इसका एक अच्छा उपयोग है default_scope { order(:name) }:।
उपयोग नहीं करने के लिए एक और कारण default_scopeहै जब आप एक मॉडल का एक उदाहरण के साथ एक 1 के लिए कई संबंध है हटा रहे हैं default_scopeमॉडल
उदाहरण के लिए विचार करें:
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end
कॉलिंग user.destroyसभी पोस्ट को हटा देगा published, लेकिन यह उन पोस्ट को नहीं हटाएगा जो हैं unpublished। इसलिए डेटाबेस एक विदेशी कुंजी उल्लंघन को फेंक देगा क्योंकि इसमें रिकॉर्ड होते हैं जो उस उपयोगकर्ता को संदर्भित करता है जिसे आप निकालना चाहते हैं।
default_scope के खिलाफ अक्सर सिफारिश की जाती है क्योंकि यह कभी-कभी गलत तरीके से परिणाम सेट को सीमित करने के लिए उपयोग किया जाता है। Default_scope का एक अच्छा उपयोग परिणाम सेट करने के लिए आदेश देना है।
मैं wheredefault_scope के उपयोग से दूर रहूंगा और इसके लिए कोई गुंजाइश नहीं बनाऊंगा।
default_scopeकेवल शामिल होने पर भी (लेकिन) तक सीमित नहीं हैं" order। का यह व्यवहार unscopedकाफी अप्रत्याशित है।
मेरे लिए एक बुरा विचार नहीं है, लेकिन सावधानी के साथ इस्तेमाल किया जाना चाहिए! एक मामला है जहां मैं हमेशा एक क्षेत्र सेट होने पर कुछ रिकॉर्ड छुपाना चाहता था।
default_scopeडीबी डिफ़ॉल्ट मान के साथ मेल खाना चाहिए (उदाहरण के लिए: { where(hidden_id: nil) })unscopedतरीका है जो आपके काम को टाल देगाdefault_scopeतो यह निर्भर करेगा और वास्तविक जरूरतों को पूरा करेगा।
मैं केवल default_scopeकुछ मापदंडों को सभी स्थितियों में ascया descआदेश के क्रम में उपयोगी होना चाहता हूं । अन्यथा मैं प्लेग की तरह इससे बचता हूं