जवाबों:
आइए मूल उदाहरण पर विचार करें:
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 का एक अच्छा उपयोग परिणाम सेट करने के लिए आदेश देना है।
मैं where
default_scope के उपयोग से दूर रहूंगा और इसके लिए कोई गुंजाइश नहीं बनाऊंगा।
default_scope
केवल शामिल होने पर भी (लेकिन) तक सीमित नहीं हैं" order
। का यह व्यवहार unscoped
काफी अप्रत्याशित है।
मेरे लिए एक बुरा विचार नहीं है, लेकिन सावधानी के साथ इस्तेमाल किया जाना चाहिए! एक मामला है जहां मैं हमेशा एक क्षेत्र सेट होने पर कुछ रिकॉर्ड छुपाना चाहता था।
default_scope
डीबी डिफ़ॉल्ट मान के साथ मेल खाना चाहिए (उदाहरण के लिए: { where(hidden_id: nil) }
)unscoped
तरीका है जो आपके काम को टाल देगाdefault_scope
तो यह निर्भर करेगा और वास्तविक जरूरतों को पूरा करेगा।
मैं केवल default_scope
कुछ मापदंडों को सभी स्थितियों में asc
या desc
आदेश के क्रम में उपयोगी होना चाहता हूं । अन्यथा मैं प्लेग की तरह इससे बचता हूं