রেলগুলিতে কন্ট্রোলার থেকে রেকর্ড বিদ্যমান কিনা তা পরীক্ষা করুন


91

আমার অ্যাপ্লিকেশনটিতে একজন ব্যবহারকারী একটি ব্যবসা তৈরি করতে পারে। যখন তারা indexআমার ক্রিয়াকলাপটি ট্রিগার করে BusinessesControllerআমি তখন কোনও ব্যবসায়ের সাথে সম্পর্কিত কিনা তা পরীক্ষা করে দেখতে চাই current_user.id:

  • যদি হ্যাঁ: ব্যবসা প্রদর্শন করুন।
  • যদি না: newক্রিয়ায় পুনর্নির্দেশ করুন ।

আমি এটি ব্যবহার করার চেষ্টা করছিলাম:

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

ব্যবসায়ের অস্তিত্ব না থাকলেও এটি সর্বদা সত্য ফিরে আসে ...

আমার ডাটাবেসে কোনও রেকর্ড বিদ্যমান থাকলে আমি কীভাবে পরীক্ষা করতে পারি?


4
whereকোনও রেকর্ড না থাকলে ব্যবহার করে একটি খালি অ্যারে ফিরে আসবে। এবং []সমান নয়nil
mind.blank

শুধু একটি সম্পর্কে কি unless Business.find_by_user_id(current_user.id)?
হেনজি

উত্তর:


231

আপনার কোড কেন কাজ করে না?

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

কাজ করে বলে মনে হচ্ছে না। এটি সেই পরীক্ষায় উত্তীর্ণ হয় এবং == নীল পরীক্ষার মতো সূচী এইচটিএমএল লোড করে চলেছে (সুতরাং আমি একটি ত্রুটি পেয়েছি: শূন্যের জন্য অপরিবর্তিত পদ্ধতি `নাম ': নীলক্লাস)।

উপস্থিত কল করার আগে প্রথমে চেষ্টা করুন
মিঃ যোশিজি

আমি একই সমস্যা

ওহ, এটাই আমার দোষ যে আমি বিভ্রান্ত হয়ে পড়েছিলাম, আপনার সাথে পরীক্ষা করা দরকারblank?
মিঃ যোশিজি

ধন্যবাদ যে কাজ! আমার সেই ভুলটি লক্ষ্য করা উচিত হয়নি। আপনি আমাকে বলতে পারেন কেন == শূন্য চেকটি কাজ করে না?

29

এই ক্ষেত্রে আমি exists?অ্যাক্টিভেকর্ড দ্বারা সরবরাহিত পদ্ধতিটি ব্যবহার করতে চাই :

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

যদি আপনি কোথাও কিছু ব্যবহার করেন তবে স্কোপগুলি এবং আরও ভাল ব্যবহারের জন্য ঝামেলা এড়াতে ভুলবেন না sc

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

বিজনেস.অনস্কোপড.হোয়ার (: ইউজার_আইডি => কারেন্ট_ইউজার.আইডি) ভাল ব্যবহার করুন .প্লাক (: আইডি) .আর? আপনি যে বস্তুটি যাচাই করছেন তার জন্য সম্পর্কের অযৌক্তিক বোঝা এড়াতে।
জুয়ানিন

1

অ্যাক্টিভেকর্ড # যেখানে একটি অ্যাক্টিভেকর্ড :: রিলেশন অবজেক্ট (যা কখনই শূন্য হবে না) ফিরিয়ে দেবে। .Empty ব্যবহার করার চেষ্টা করবেন? এটি যদি কোনও রেকর্ড ফেরত দেয় তবে পরীক্ষার সাথে সম্পর্কিত on


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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.