जाँच करें कि क्या रिकॉर्डर्स में कंट्रोलर से रिकॉर्ड मौजूद है


91

मेरे ऐप में एक उपयोगकर्ता एक व्यवसाय बना सकता है। जब वे indexमेरे BusinessesControllerव्यवसाय में कार्रवाई को ट्रिगर करते हैं, तो मैं यह जांचना चाहता हूं कि क्या व्यवसाय से संबंधित है current_user.id:

  • यदि हाँ: व्यवसाय प्रदर्शित करें।
  • यदि नहीं: newकार्रवाई के लिए पुनर्निर्देशित ।

मैं इसका उपयोग करने की कोशिश कर रहा था:

if Business.where(:user_id => current_user.id) == nil
  # no business found
end

लेकिन यह हमेशा सच है जब भी व्यापार मौजूद नहीं है ...

यदि मेरे डेटाबेस में कोई रिकॉर्ड मौजूद है तो मैं कैसे परीक्षण कर सकता हूं?


1
whereयदि कोई रिकॉर्ड नहीं है, तो खाली सरणी का उपयोग करके वापस आ जाएगा। और []बराबर नहीं हैnil
mind.blank

बस एक के बारे में क्या unless Business.find_by_user_id(current_user.id)?
हेंगजी

जवाबों:


229

आपका कोड काम क्यों नहीं करता है?

whereविधि रिटर्न एक ActiveRecord :: रिलेशन वस्तु (एक सरणी जिसका परिणाम होता है की तरह काम करता where), यह खाली हो सकता है, लेकिन यह कभी नहीं होगाnil

Business.where(id: -1) 
 #=> returns an empty ActiveRecord::Relation ( similar to an array )
Business.where(id: -1).nil? # ( similar to == nil? )
 #=> returns false
Business.where(id: -1).empty? # test if the array is empty ( similar to .blank? )
 #=> returns true

कम से कम एक रिकॉर्ड मौजूद है तो कैसे परीक्षण करें?

विकल्प 1: उपयोग करना.exists?

if Business.exists?(user_id: current_user.id)
  # same as Business.where(user_id: current_user.id).exists?
  # ...
else
  # ...
end

विकल्प 2:.present? (या .blank?, के विपरीत .present?) का उपयोग करना

if Business.where(:user_id => current_user.id).present?
  # less efficiant than using .exists? (see generated SQL for .exists? vs .present?)
else
  # ...
end

विकल्प 3: यदि कथन में परिवर्तनीय असाइनमेंट है

if business = Business.where(:user_id => current_user.id).first
  business.do_some_stuff
else
  # do something else
end

इस विकल्प को कुछ लिंटर्स (उदाहरण के लिए रूबोकॉप) द्वारा एक कोड गंध माना जा सकता है।

विकल्प 3 बी: चर असाइनमेंट

business = Business.where(user_id: current_user.id).first
if business
  # ...
else
  # ...
end

तुम भी उपयोग कर सकते हैं .find_by_user_id(current_user.id)के बजाय.where(...).first


सर्वोत्तम विकल्प:

  • यदि आप Businessऑब्जेक्ट का उपयोग नहीं करते हैं : विकल्प 1
  • यदि आपको Businessऑब्जेक्ट का उपयोग करने की आवश्यकता है : विकल्प 3

यह काम नहीं लगता था। यह उस टेस्ट को पास करता रहता है और इंडेक्स html को == नील टेस्ट के साथ लोड करता है (इसलिए मुझे एक त्रुटि मिल रही है: nil के लिए अपरिभाषित विधि `नाम ': NilClass)।

वर्तमान में कॉल करने से पहले पहले प्रयास करें
मृयोशीजी

मुझे एक ही समस्या है

ओह, यह मेरी गलती है मैं भ्रमित था, आपको इसके साथ परीक्षण करने की आवश्यकता हैblank?
MrYoshiji

धन्यवाद कि काम किया! मुझे उस गलती पर ध्यान नहीं देना चाहिए था। क्या आप मुझे बता सकते हैं कि == नील जाँच क्यों नहीं हुई?

29

इस मामले में मैं exists?ActiveRecord द्वारा प्रदान की गई विधि का उपयोग करना पसंद करता हूं :

Business.exists? user_id: current_user.id

मौजूद है? या संभव के साथ?
इमरान अहमद

5

'मौजूद है?':

Business.exists? user_id: current_user.id #=> 1 or nil

कोई भी?':

Business.where(:user_id => current_user.id).any? #=> true or false

यदि आप .where के साथ कुछ का उपयोग करते हैं, तो स्कोप और बेहतर उपयोग के साथ परेशानी से बचने के लिए सुनिश्चित करें ।unscoped

Business.unscoped.where(:user_id => current_user.id).any?

बेहतर उपयोग करें Business.unscoped.where (: user_id => current_user.id) .pluck:: id) .any आपके द्वारा जाँच की जा रही वस्तु के लिए संबंधों के अनावश्यक भार से बचने के लिए।
जुआनिन

1

ActiveRecord # जहां ActiveRecord :: Relation ऑब्जेक्ट लौटाएगा (जो कभी शून्य नहीं होगा)। .Empty का उपयोग करने का प्रयास करें परीक्षण के संबंध में अगर यह किसी भी रिकॉर्ड को वापस कर देगा।


1

जब आप कॉल Business.where(:user_id => current_user.id)करेंगे तो आपको एक सरणी मिलेगी। इस सरणी में कोई ऑब्जेक्ट या एक या कई ऑब्जेक्ट नहीं हो सकते हैं, लेकिन यह शून्य नहीं होगा। इस प्रकार चेक == नील कभी सत्य नहीं होगा।

आप निम्नलिखित की कोशिश कर सकते हैं:

if Business.where(:user_id => current_user.id).count == 0

इसलिए आप ऐरे में तत्वों की संख्या की जाँच करें और उनकी तुलना शून्य से करें।

या आप कोशिश कर सकते हैं:

if Business.find_by_user_id(current_user.id).nil?

यह एक या शून्य लौटेगा।



0

अगर आप के साथ काम करने के लिए वस्तु के एक उदाहरण चर की जरूरत है तो मैं इसे इस तरह से करूंगा:

if @business = Business.where(:user_id => current_user.id).first
  #Do stuff
else
  #Do stuff
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.