दिलचस्प पोस्ट
वेब पर फ़ॉन्ट Angular2 – त्रुटि अगर {{object.field}} मौजूद है, तो जांच नहीं है Php स्ट्रिंग से नियंत्रण अक्षर निकालें दशमलव संख्या के नियमित अभिव्यक्ति, जहां दशमलव के बाद अंक वैकल्पिक है WPF – क्लिक करने योग्य हाइपरलिंक्स किसी टैब कंट्रोलोल में टैब आइटम्स के भीतर कंट्रोल स्टेट को संरक्षित कैसे करें उपयोगकर्ता नाम (जो) को सी # में संशोधित फ़ाइल खोजें PHP: एक सत्र का डिफ़ॉल्ट जीवनकाल क्या है जावास्क्रिप्ट – सिंक और एसिंक मॉड्यूल के लिए एक युक्ति क्यों है? क्या पृष्ठभूमि-स्थिति- x (पृष्ठभूमि-स्थिति- y) एक मानक W3C सीएसएस संपत्ति है? iframe shimming या ie6 (और नीचे) z- सूचकांक बग का चयन करें @ एस्पेस जे विशिष्ट व्याख्या के साथ एक वर्ग के सभी तरीकों के लिए कमाना क्यों है & # 65279; मेरे HTML में दिख रहा है? ASP.NET में मास्टरपेज का उपयोग करते समय JQuery का उपयोग करने का सही तरीका है? पकड़ और अंत में वापस बयान का व्यवहार

क्यों रेल डिफ़ॉल्ट_scope का उपयोग अक्सर के खिलाफ सिफारिश कर रहे हैं?

हर जगह इंटरनेट पर लोगों का कहना है कि रेल का उपयोग करना default_scope एक बुरा विचार है, और default_scope पर default_scope लिए शीर्ष हिट यह कैसे ओवरराइट करने के बारे में हैं यह गड़बड़ी महसूस करता है, और एक स्पष्ट सवाल (मुझे लगता है) के गुण हैं।

तो: रेल default_scope का उपयोग क्यों करना है जैसे कि एक बुरा विचार?

वेब के समाधान से एकत्रित समाधान "क्यों रेल डिफ़ॉल्ट_scope का उपयोग अक्सर के खिलाफ सिफारिश कर रहे हैं?"

समस्या 1

बुनियादी उदाहरण पर विचार करें:

 class Post < ActiveRecord::Base default_scope { where(published: true) } end 

डिफ़ॉल्ट published: true करने की प्रेरणा 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 को प्रतिबिंबित किया जाएगा। इसलिए जब आप शायद अप्रकाशित पोस्ट्स को मौके से सूचीबद्ध नहीं करना चाहते हैं, तो आप अब प्रकाशित होकर डिफ़ॉल्ट रूप से बना रहे हैं

समस्या 2

एक अधिक विस्तृत उदाहरण पर गौर करें:

 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]] 

यह अपेक्षित दिखता है (user_id के बारे में हिस्सा देखने के लिए सभी तरह से स्क्रॉल करना सुनिश्चित करें)

अब हम सभी पदों की सूची प्राप्त करना चाहते हैं – अप्रकाशित शामिल – उपयोगकर्ता के दृश्य में लॉग इन करने के लिए कहते हैं। आपको पता चल जाएगा कि आपको 'ओवरराइट' करना होगा या default_scope के प्रभाव को 'पूर्ववत करें' त्वरित Google के बाद, आपको unscoped बारे में पता चल जाएगा। देखें कि आगे क्या होगा:

 2.1.1 :002 > User.first.posts.unscoped Post Load (0.2ms) SELECT "posts".* FROM "posts" 

=> अनसैक्ड ने सभी स्कोप को हटा दिया है जो सामान्य रूप से आपके चयन पर लागू हो सकते हैं, जिनमें शामिल हैं (लेकिन सीमित नहीं) संगठनों।

डिफ़ॉल्ट_स्कॉप के विभिन्न प्रभावों को ओवरराइट करने के कई तरीके हैं यह अधिकार बहुत जल्दी से जटिल हो जाता है और मैं पहले स्थान पर default_scope का उपयोग नहीं करने का तर्क देता हूं, यह एक सुरक्षित विकल्प होगा

default_scope अक्सर इसकी सिफारिश की जाती है क्योंकि यह परिणाम समूह को सीमित करने के लिए कभी-कभी गलत तरीके से उपयोग किया जाता है। डिफॉल्ट_स्कोप का अच्छा उपयोग, परिणाम सेट को ऑर्डर करने के लिए है।

मैं डिफ़ॉल्ट_सस्कोप में where से दूर रहना चाहता हूं और इसके लिए एक गुंजाइश बनाना है।